



Встроенного метода разделения строк нет. Вы должны написать это самостоятельно, используя
String.indexOf() и String.substring(). Не трудно.
Да, но будет ли это эффективно с памятью? String.substring () создаст новые строки, которые будут занимать память до тех пор, пока не будет собран мусор.
StringTokenizer.nextToken () содержит "return string.subString (...)" внутри, поэтому я не думаю, что вам хуже ...
Substring использует частную конструкцию для String, которая разделяет (неизменяемый) массив char, так что да - это будет эффективно с точки зрения памяти.
Это зависит от того, чего именно вы хотите достичь, но где-то там будет функция String.substring ():
String myString = "Hello World";
Это напечатает подстроку, начиная с индекса 6 до конца строки:
System.out.println(myString.substring(6));
Это напечатает подстроку, начиная с индекса 0 до индекса 5:
System.out.println(myString.substring(0,5));
Вывод всего кода выше:
World Hello
Объедините это с другими строковыми функциями (indexOf() и т. д.) Для достижения желаемого эффекта!
Перечитывая свой вопрос, похоже, вы искали String.split(). Это разделит вашу входную строку на массив строк на основе заданного регулярного выражения:
String myString = "Hi-There-Gang";
String[] splitStrings = myString.split("-");
В результате получится массив splitStrings, содержащий три строки: "Hi", "There" и "Gang".
Перечитывая ваш вопрос еще раз, String.split недоступен в J2ME, но тот же эффект может быть достигнут с substring и indexOf.
String.split (...) доступен в J2SE, но не в J2ME.
Вам необходимо написать свой собственный алгоритм: связанный пост с образцом решения.
Есть несколько реализаций класса StringTokenizer для J2ME. Этот от Остермиллер, скорее всего, будет включать в себя нужную вам функциональность
См. Также эта страница на Пит-стопе мобильного программирования для некоторых модификаций и следующий пример:
String firstToken;
StringTokenizer tok;
tok = new StringTokenizer("some|random|data","|");
firstToken= tok.nextToken();
Надеюсь, это поможет вам ... Это моя собственная реализация, которую я использовал в своем приложении. Конечно, это еще можно оптимизировать. у меня просто нет времени на это ... а еще я работаю над StringBuffer здесь. Просто реорганизуйте это, чтобы вместо этого можно было использовать String.
public static String[] split(StringBuffer sb, String splitter){
String[] strs = new String[sb.length()];
int splitterLength = splitter.length();
int initialIndex = 0;
int indexOfSplitter = indexOf(sb, splitter, initialIndex);
int count = 0;
if (-1==indexOfSplitter) return new String[]{sb.toString()};
while(-1!=indexOfSplitter){
char[] chars = new char[indexOfSplitter-initialIndex];
sb.getChars(initialIndex, indexOfSplitter, chars, 0);
initialIndex = indexOfSplitter+splitterLength;
indexOfSplitter = indexOf(sb, splitter, indexOfSplitter+1);
strs[count] = new String(chars);
count++;
}
// get the remaining chars.
if (initialIndex+splitterLength<=sb.length()){
char[] chars = new char[sb.length()-initialIndex];
sb.getChars(initialIndex, sb.length(), chars, 0);
strs[count] = new String(chars);
count++;
}
String[] result = new String[count];
for(int i = 0; i<count; i++){
result[i] = strs[i];
}
return result;
}
public static int indexOf(StringBuffer sb, String str, int start){
int index = -1;
if ((start>=sb.length() || start<-1) || str.length()<=0) return index;
char[] tofind = str.toCharArray();
outer: for(;start<sb.length(); start++){
char c = sb.charAt(start);
if (c==tofind[0]){
if (1==tofind.length) return start;
inner: for(int i = 1; i<tofind.length;i++){ // start on the 2nd character
char find = tofind[i];
int currentSourceIndex = start+i;
if (currentSourceIndex<sb.length()){
char source = sb.charAt(start+i);
if (find==source){
if (i==tofind.length-1){
return start;
}
continue inner;
} else {
start++;
continue outer;
}
} else {
return -1;
}
}
}
}
return index;
}
кстати, вот как можно использовать код ... String [] elements = split (new StringBuffer ("Hello | World"), "|"); или String [] elements = split (новый StringBuffer ("HelloblahWorld"), "мля"); оба возвращают {"Hello", "World"}
public static Vector splitDelimiter(String text, char delimiter) {
Vector splittedString = null;
String text1 = "";
if (text != null) {
splittedString = new Vector();
for (int i = 0; i < text.length(); i++) {
if (text.charAt(i) == delimiter) {
splittedString.addElement(text1);
text1 = "";
} else {
text1 += text.charAt(i);
// if (i==text.length()-1){
// splittedString.addElement(text1);
// }
}
}
splittedString.addElement(text1);
}
return s
}
Вы можете использовать этот метод для разделения разделителя.
В J2ME нет разделения, но вы можете использовать этот код для разделения. Этот код работает только с 1 символом-разделителем !!! Используйте NetBeans.File \ Create Project \ Java ME \ MobileApplication \ Set project name (split) \ Set checkmark. Удалите весь код в вашем (Midlet.java). Скопируйте этот код и вставьте его в свой (Midlet.java).
//IDE NetBeans 7.3.1
//author: UserSuperPupsik
//email: [email protected]
package split;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import java.util.Vector;
public class Midlet extends MIDlet {
public String e1;
public Vector v=new Vector();
public int ma;
int IsD=0;
int vax=0;
public String out[];
private Form f;
public void split0(String text,String delimiter){
if (text! = ""){
IsD=0;
int raz=0;
//v.removeAllElements();
v.setSize(0);
int io;
String temp = "";
int ni=(text.length()-1);
for(io=0;io<=ni;io++){
char ch=text.charAt(io);
String st = ""+ch;
if (io==0 && st.equals(delimiter)){IsD=1;}
if (!st.equals(delimiter)){temp=temp+st;} //Not equals (!=)
else if (st.equals(delimiter)&&temp! = "")//equals (==)
{
IsD=1;
//f.append(temp);
v.addElement(temp);
temp = "";
}
if (io==ni && temp! = "") {
v.addElement(temp);
temp = "";
}
if ((io==ni)&&IsD==0&&temp! = ""){v.addElement(temp);}
}
if (v.size()!=0){
ma=(v.size());
out=new String[ma];
v.copyInto(out);
}
//else if (v.size()==0){IsD=1; }
}
}
public void method1(){
f.append("\n");
f.append("IsD: " +IsD+"");
if (v.size()!=0){
for( vax=0;vax<=ma-1;vax++){
f.append("\n");
f.append(out[vax]);
}
}
}
public void startApp() {
f=new Form("Hello J2ME!");
Display.getDisplay(this).setCurrent(f);
f.append("");
split0("Hello.World.Good...Luck.end" , ".");
method1();
split0(".",".");
method1();
split0(" First WORD2 Word3 "," ");
method1();
split0("...",".");
method1();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}
Разделенные элементы, расположенные в массиве с именем (out). Для примера out [1]: Hello. Удачи!!!
Другое альтернативное решение:
public static Vector split(String stringToSplit, String separator){
if (stringToSplit.length<1){
return null;
}
Vector stringsFound = new Vector();
String remainingString = stringToSplit;
while(remainingString.length()>0){
int separatorStartingIndex = remainingString.indexOf(separator);
if (separatorStartingIndex==-1){
// Not separators found in the remaining String. Get substring and finish
stringsFound.addElement(remainingString);
break;
}
else{
// The separator is at the beginning of the String,
// Push the beginning at the end of separator and continue
if (remainingString.startsWith(separator)){
remainingString = remainingString.substring(separator.length());
}
// The separator is present and is not the beginning, add substring and continue
else{
stringsFound.addElement(remainingString.substring(0, separatorStartingIndex));
remainingString = remainingString.substring(separatorStartingIndex + separator.length());
}
}
}
return stringsFound;
}
Небольшое замечание, не помогает с J2ME, но может помочь другим в будущем ... К сожалению, StringTokenizer устарел в J2SE. Предлагаемая замена - просто использовать метод разделения строк. Скорее всего, StringTokenizer создал хороший, приятный код. Изменение его, чтобы просто использовать метод разделения String, делает код более громоздким. Это действительно похоже на способ Java: отказаться от хороших функций и посоветовать людям использовать вместо них неуклюжие.