2008-10-14 13 views
14

Come faccio a dividere le stringhe in J2ME in modo efficace?Come dividere le stringhe in J2ME?

C'è un StringTokenizer o String.split(String regex) nell'edizione standard (J2SE), ma sono assenti nella versione micro (J2ME, MIDP).

+1

Un po 'di una nota a margine, non aiuta con J2ME, ma potrebbe aiutare gli altri in futuro ... Purtroppo, StringTokenizer è stato sconsigliato in J2SE. La sostituzione suggerita è quella di utilizzare semplicemente il metodo Split split. Piuttosto sfortunato, StringTokenizer fatto per un bel codice slick. Cambiarlo per usare semplicemente il metodo Split split rende il codice più clunkier. Questo sembra essere il modo Java, deprecano le buone caratteristiche e dicono alle persone di usare solo quelle goffe. –

risposta

11

Esistono alcune implementazioni di una classe StringTokenizer per J2ME. Questo uno per Ostermiller molto probabilmente includerà le funzionalità necessarie

Vedi anche this page on Mobile Programming Pit Stop per alcune modifiche e il seguente esempio:

String firstToken; 
StringTokenizer tok; 

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

Grazie, era esattamente quello di cui avevo bisogno. – Spoike

+0

link non funzionante per la libreria. Puoi fornire un lavoro. –

3

Non esiste un metodo integrato per dividere le stringhe. Devi scrivere da solo usando String.indexOf() e String.substring(). Non difficile.

+2

Sì, ma la memoria sarà efficace? String.substring() creerà nuove stringhe, che manterranno la memoria fino alla raccolta dei dati inutili. – Spoike

+0

StringTokenizer.nextToken() contiene "return string.subString (...)" internamente, quindi non penso che tu stia peggio ... – Cowan

+0

La sottostringa usa un costrutto privato per String che condivide l'array di caratteri (immutabile) quindi sì, sarà efficiente in termini di memoria. Il collegamento – ddimitrov

2

Questo dipende da cosa esattamente si vuole raggiungere, ma la funzione String.substring() sarà da qualche parte:

String myString = "Hello World"; 

Questo stamperà la sottostringa a partire dall'indice 6 alla fine della stringa :

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

Questo stamperà la sottostringa a partire dall'indice 0 fino Indice 5:

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

uscita di tutto il codice di cui sopra:

 
World 
Hello 

Combinate questo con le altre funzioni di stringa (indexOf(). ecc.) per ottenere l'effetto desiderato!

Rileggendo la tua domanda, sembra che stavi cercando String.split(). In questo modo dividere la stringa di input in un array di stringhe basata su un dato regex:

String myString = "Hi-There-Gang"; 

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

Questo si tradurrà nella matrice splitStrings che contiene tre archi, "Hi", "There" e "Gang".

Rileggendo nuovamente la domanda, String.split non è disponibile in J2ME, ma lo stesso effetto può essere ottenuto con substring e indexOf.

3

Spero che questo vi aiuterà a ... Questa è la mia propria implementazione i usato nella mia applicazione. Naturalmente questo può ancora essere ottimizzato. non ho tempo di farlo ... e inoltre, sto lavorando su StringBuffer qui. Basta refactarlo per poter usare 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; 
} 
+0

btw, ecco come utilizzare il codice ... Stringa [] elements = split (new StringBuffer ("Hello | World"), "|"); o String [] elements = split (new StringBuffer ("HelloblahWorld"), "blah"); entrambi restituisce {"Ciao", "Mondo"} – demotics2002

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

È possibile utilizzare questo metodo per suddividere un delimitatore.

1

In J2ME nessuna divisione, ma è possibile utilizzare questo codice per split.Questo codice funziona con solo 1 simbolo delimitatore !!! Usa NetBeans.File \ Crea progetto \ Java ME \ MobileApplication \ Imposta nome progetto (diviso) \ Imposta segno di spunta.Eliminare tutto il codice nel file (Midlet.java). Copiare questo codice e incollarlo nel (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) { 
    } 




} 

elementi splited ubicata nella matrice chiamati (out) .Per Esempio out [1]: Ciao. Buona fortuna !!!

0

Un'altra soluzione 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; 
}