Pergunta

Como faço para dividir seqüências em J2ME de uma forma eficaz?

Há um StringTokenizer ou String.split(String regex) na edição padrão (J2SE), mas eles estão ausentes na micro edition (J2ME, MIDP).

Foi útil?

Solução

Existem algumas implementações de uma classe StringTokenizer para J2ME. Este um por Ostermiller provavelmente irá incluir a funcionalidade que você precisa

Veja também esta página em dispositivos móveis Programação Pit Stop para algumas modificações e exemplo a seguir:

String firstToken;
StringTokenizer tok;

tok = new StringTokenizer("some|random|data","|");
firstToken= tok.nextToken();

Outras dicas

Não há construído em método para cordas de divisão. Você tem que escrever em seu próprio país usando String.indexOf() e String.substring(). Não é difícil.

String.split (...) está disponível em J2SE, mas não J2ME.
Você é obrigado a escrever o seu próprio algoritmo:. post relacionado com a solução de amostra

Espero que este irá ajudá-lo ... Esta é a minha própria implementação i usado em meu aplicativo. Claro que isso ainda pode ser otimizado. i simplesmente não têm tempo para fazê-lo ... e também, eu estou trabalhando em StringBuffer aqui. Apenas refatorar este seja capaz de usar String em vez.

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;
}

Isso depende do que exatamente você quer alcançar, mas a função String.substring () será em algum lugar:

String myString = "Hello World";

Isto irá imprimir o substring a partir de índice 6 até o fim da string:

System.out.println(myString.substring(6));

Isto irá imprimir o substring a partir de índice 0 até índice 5:

System.out.println(myString.substring(0,5));

Saída de todo o código acima:

World
Hello

Combine isso com as outras funções de corda (indexOf(). Etc.) para alcançar o efeito desejado!

Re-lendo sua pergunta, parece que você pode ter sido procurando String.split(). Isto irá dividir a sua cadeia de entrada em uma matriz de seqüências com base em um determinado regex:

String myString = "Hi-There-Gang";

String[] splitStrings = myString.split("-");

Isto irá resultar na matriz splitStrings contendo três cordas, "Hi", "There" e "Gang".

Re-lendo a pergunta novamente, String.split não está disponível em J2ME, mas o mesmo efeito pode ser conseguido com substring e indexOf.

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
     }

Você pode usar esse método para dividir um delimitador.

Em J2ME nenhuma separação, mas você pode usar este código para o código funciona split.This com apenas delimitador 1 simbol !!! Use NetBeans.File \ Criar Project \ Java ME \ MobileApplication \ Set nome do projeto (split) \ Set checkmark.Delete todo o código em sua (Midlet.java) .Copy este código e passado em sua (Midlet.java).

//IDE NetBeans 7.3.1
//author: UserSuperPupsik 
//email: usersuperpupsik@gmail.com



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) {
    }




}

splited elementos localizados na matriz chamada (para fora) .Por exemplo a [1]: Olá. Boa Sorte !!!

Outra solução alternativa:

 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;
 }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top