Как разделить строки в J2ME?


person Spoike    schedule 14.10.2008    source источник
comment
Небольшое замечание, не помогает с J2ME, но может помочь другим в будущем... К сожалению, StringTokenizer устарел в J2SE. Предлагаемая замена состоит в том, чтобы просто использовать метод разделения строк. Довольно неудачно, StringTokenizer сделал хороший гладкий код. Изменение его, чтобы просто использовать метод разделения строк, делает код более громоздким. Тем не менее, похоже, что это путь Java, осуждающий хорошие функции и предлагающий людям вместо этого просто использовать неуклюжие.   -  person Brian Knoblauch    schedule 27.07.2010


Ответы (8)


Существует несколько реализаций класса StringTokenizer для J2ME. Этот от Ostermiller, скорее всего, будет включать в себя необходимые вам функции.

См. также эту страницу Пит-стопа мобильного программирования, чтобы узнать о некоторых модификации и следующий пример:

String firstToken;
StringTokenizer tok;

tok = new StringTokenizer("some|random|data","|");
firstToken= tok.nextToken();
person Jonas Pegerfalk    schedule 14.10.2008

Нет встроенного метода для разделения строк. Вы должны написать его самостоятельно, используя String.indexOf() и String.substring(). Не трудно.

person Guido    schedule 14.10.2008
comment
Да, но будет ли это эффективно для памяти? String.substring() создаст новые строки, которые будут занимать память до тех пор, пока не будет собран мусор. - person Spoike; 14.10.2008
comment
StringTokenizer.nextToken() содержит return string.subString(...) внутри, поэтому я не думаю, что вам хуже... - person Cowan; 14.10.2008
comment
Substring использует частную конструкцию для String, которая разделяет (неизменяемый) массив символов, поэтому да - это будет эффективно использовать память. - person ddimitrov; 14.10.2008

String.split(...) доступен в J2SE, но не в J2ME.
Вам необходимо написать собственный алгоритм: похожий пост с примером решения.

person Llyle    schedule 14.10.2008

Я надеюсь, что это поможет вам... Это моя собственная реализация, которую я использовал в своем приложении. Конечно, это все еще можно оптимизировать. у меня просто нет времени этим заниматься... а еще я работаю здесь над 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;
}
person demotics2002    schedule 27.07.2010
comment
Кстати, вот как вы можете использовать код... String[] elements = split(new StringBuffer(Hello|World), |); или String[] elements = split(новый StringBuffer(HelloblahWorld), бла); оба возвращают {Hello, World} - person demotics2002; 27.07.2010

Это зависит от того, чего именно вы хотите добиться, но функция 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.

person Rob Bell    schedule 14.10.2008

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
     }

Вы можете использовать этот метод для разделения разделителя.

person Rahul    schedule 25.09.2012

В J2ME нет разделения, но вы можете использовать этот код для разделения. Этот код работает только с 1 разделителем символов!!! Используйте NetBeans.File\Create Project\ Java ME\ MobileApplication\Установите имя проекта (разделить)\Установите галочку. Удалите весь код в своем (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. Удачи!!!

person UserSuperPupsik    schedule 29.09.2013

Другое альтернативное решение:

 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;
 }
person Miguel Rivero    schedule 19.08.2014