2008-10-14 13 views
14

¿Cómo puedo dividir cadenas en J2ME de manera efectiva?¿Cómo puedo dividir cadenas en J2ME?

Hay un StringTokenizer o String.split(String regex) en la edición estándar (J2SE), pero están ausentes en la edición micro (J2ME, MIDP).

+1

Un poco de una nota al margen, no ayuda con J2ME, pero podría ayudar a otros en el futuro ... Por desgracia, StringTokenizer ya no se utiliza en J2SE. El reemplazo sugerido es simplemente usar el método de división de cadenas. Bastante desafortunado, StringTokenizer hizo un buen código pulido. Cambiarlo solo para usar el método de división de cadenas lo convierte en un código de clunkier. Sin embargo, esa parece ser la forma de Java, desaprobar las buenas características y decirle a la gente que simplemente use las torpes. –

Respuesta

11

Hay algunas implementaciones de una clase StringTokenizer para J2ME. Este uno por Ostermiller muy probablemente incluirá la funcionalidad que necesita

Véase también this page on Mobile Programming Pit Stop para algunas modificaciones y el siguiente ejemplo:

String firstToken; 
StringTokenizer tok; 

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

Gracias, eso era exactamente lo que necesitaba. – Spoike

+0

enlace muerto para la biblioteca. ¿Puedes proporcionar uno que funcione? –

3

No existe un método integrado para dividir cadenas. Tienes que escribirlo solo usando String.indexOf() y String.substring(). No dificil.

+2

Sí, pero ¿será efectiva la memoria? String.substring() creará nuevas cadenas, que alimentarán la memoria hasta que se recoja la basura. – Spoike

+0

StringTokenizer.nextToken() contiene "return string.subString (...)" internamente, así que no creo que estés peor ... – Cowan

+0

Substring usa una construcción privada de String que comparte la matriz de caracteres (inmutable) , entonces sí, será eficiente desde el punto de vista de la memoria. – ddimitrov

2

Eso depende de qué es exactamente lo que quiere lograr, pero el String.substring función() estará en algún lugar:

String myString = "Hello World"; 

Esto imprimirá la subcadena a partir del índice de 6 hasta el final de la cadena :

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

Esto imprimirá la subcadena a partir de índice 0 hasta el índice 5:

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

La producción total de código anterior:

 
World 
Hello 

Combine esto con las otras funciones de cadena (indexOf(). etc.) para lograr el efecto deseado!

Al volver a leer su pregunta, parece que puede haber estado buscando String.split(). Esto dividirá su cadena de entrada en una matriz de cadenas a base de una expresión regular dada:

String myString = "Hi-There-Gang"; 

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

Esto dará lugar a la matriz que contiene splitStrings tres cuerdas, "Hi", "There" y "Gang".

Vuelva a leer su pregunta de nuevo, String.split no está disponible en J2ME, pero el mismo efecto se puede lograr con substring y indexOf.

3

espero que éste le ayudará a ... Esta es mi propia implementación i usado en mi aplicación Por supuesto, esto aún se puede optimizar. simplemente no tengo tiempo para hacerlo ... y también, estoy trabajando en StringBuffer aquí. Simplemente refactorice esto para poder usar String en su lugar.

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

por cierto, así es como puede usar el código ... Cadena [] elements = split (new StringBuffer ("Hello | World"), "|"); o String [] elements = split (new StringBuffer ("HelloblahWorld"), "blah"); both returns {"Hello", "World"} – 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 
    } 

Usted puede utilizar este método para dividir un delimitador.

1

En J2ME no hay división, pero puede usar este código para dividir. ¡Este código funciona con solo 1 delimitador de símbolos! Usar NetBeans.File \ Create Project \ Java ME \ MobileApplication \ Establecer el nombre del proyecto (división) \ Establecer marca de verificación. Borrar todo el código en su (Midlet.java). Copiar este código y pasado en su (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) { 
    } 




} 

elementos Splited ubicados en matriz llamada (out) .Por ejemplo fuera [1]: Hola. ¡Buena suerte!

0

Otra solución 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; 
}