2008-10-14 10 views
14

Comment découper des chaînes dans J2ME de manière efficace?Comment séparer des chaînes dans J2ME?

Il existe un StringTokenizer ou String.split(String regex) dans l'édition standard (J2SE), mais ils sont absents dans la version micro (J2ME, MIDP).

+1

Un peu d'une note de côté, ne vous aide pas avec J2ME, mais pourrait aider les autres à l'avenir ... Malheureusement, StringTokenizer a été dépréciée dans J2SE. Le remplacement suggéré consiste simplement à utiliser la méthode de division de chaîne. Plutôt malheureux, StringTokenizer fait pour un joli code sympa. Le changer pour utiliser simplement la méthode de split String fait du code clunkier. Cela semble être la façon de Java, déprécier les bonnes fonctionnalités et dire aux gens d'utiliser les clunky à la place. –

Répondre

11

Il y a quelques implémentations d'une classe StringTokenizer pour J2ME. Celui-ci par Ostermiller sera très probablement inclure la fonctionnalité dont vous avez besoin

Voir aussi this page on Mobile Programming Pit Stop quelques modifications et l'exemple suivant:

String firstToken; 
StringTokenizer tok; 

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

Merci, c'était exactement ce dont j'avais besoin. – Spoike

+0

lien mort pour la bibliothèque. Pouvez-vous fournir un travail. –

3

Il n'y a pas construit en méthode pour diviser les chaînes. Vous devez écrire sur votre propre à l'aide String.indexOf() et String.substring(). Pas dur.

+2

Oui, mais est-ce que la mémoire sera efficace? String.substring() va créer de nouvelles chaînes, qui vont écraser la mémoire jusqu'à la collecte des ordures. – Spoike

+0

StringTokenizer.nextToken() contient "return string.subString (...)" en interne, donc je ne pense pas que vous soyez pire ... – Cowan

+0

La sous-chaîne utilise un construct privé pour String qui partage le tableau char (immuable) , oui - ce sera efficace pour la mémoire. – ddimitrov

2

Cela dépend exactement ce que vous voulez atteindre, mais la fonction String.substring() sera là quelque part:

String myString = "Hello World"; 

Ce imprimera la sous-chaîne à partir de l'index 6 à la fin de la chaîne :

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

Cette imprimera la sous-chaîne à partir de l'index 0 jusqu'à ce que l'indice 5:

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

sortie de tout le code ci-dessus:

 
World 
Hello 

Combinez cela avec les autres fonctions de chaîne (indexOf(). etc.) pour obtenir l'effet désiré!

Relisant votre question, il semble que vous cherchiez peut-être String.split(). Cela va diviser votre chaîne d'entrée dans un tableau de chaînes à partir d'une expression rationnelle donnée:

String myString = "Hi-There-Gang"; 

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

Cela se traduira dans le tableau splitStrings contenant trois cordes, "Hi", "There" et "Gang".

Relisant à nouveau votre question, String.split n'est pas disponible dans J2ME, mais le même effet peut être obtenu avec substring et indexOf.

3

J'espère que celui-ci vous aidera à ... Ceci est ma propre implémentation i utilisé dans mon application. Bien sûr, cela peut encore être optimisé. Je n'ai juste pas le temps de le faire ... et aussi, je travaille sur StringBuffer ici. Juste refactoriser ceci pour être capable d'utiliser String à la place.

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, voici comment vous pouvez utiliser le code ... String [] elements = split (nouveau StringBuffer ("Hello | World"), "|"); String [] elements = split (nouveau StringBuffer ("HelloblahWorld"), "blah"); les deux retours {"Bonjour", "Monde"} – 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 
    } 

Vous pouvez utiliser cette méthode pour diviser un delimiter.

1

En J2ME pas de split, mais vous pouvez utiliser ce code pour split.Ce code fonctionne avec seulement 1 délimiteur simbol !!! Utilisez le fichier NetBeans.File \ Create Project \ Java ME \ MobileApplication \ Définissez le nom du projet (fractionné) \ Définissez la case à cocher. Supprimez tout le code dans votre (Midlet.java) .Copiez ce code et passez dans votre (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) { 
    } 




} 

Éléments divisés situés dans le tableau appelé (out) .Pour Exemple sortie [1]: Bonjour. Bonne chance !!!

0

Une autre solution de rechange:

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