2008-10-14 74 views
14

如何以有效的方式在J2ME中分割字符串?如何在J2ME中分割字符串?

標準版(J2SE)中有StringTokenizerString.split(String regex),但它們在微版(J2ME,MIDP)中不存在。

+1

一個側面說明的一點,不與J2ME幫助,但可能會幫助別人的未來......不幸的是,StringTokenizer的已過時,J2SE。建議的替換是僅使用字符串拆分方法。相當不幸的是,StringTokenizer爲了一些漂亮的代碼而做出的。改變它只是使用字符串拆分方法使得代碼更笨拙。這似乎確實是Java的方式,貶低好的功能,並告訴人們只是使用笨重的功能。 – 2010-07-27 12:50:56

回答

11

J2ME有一些StringTokenizer類的實現。這一個Ostermiller將最有可能包括的功能,你需要

又見this page on Mobile Programming Pit Stop了一些修改和下面的例子:

String firstToken; 
StringTokenizer tok; 

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

沒有內置的方法來拆分字符串。你必須使用 String.indexOf()String.substring()自己寫。不難。

+2

是的,但會記憶有效嗎? String.substring()將創建新的字符串,這將佔用內存直到垃圾收集。 – Spoike 2008-10-14 11:32:00

+0

StringTokenizer.nextToken()在內部包含「return string.subString(...)」,所以我認爲你不會變得更糟...... – Cowan 2008-10-14 12:01:03

+0

Substring使用私有構造函數String來共享(不可變)char數組,所以是的 - 它會提高內存效率。 – ddimitrov 2008-10-14 13:27:26

2

這取決於你究竟想達到什麼,但功能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("-"); 

這將導致包含三個串,"Hi""There""Gang"的splitStrings陣列英寸

再次重新閱讀您的問題,String.split在J2ME中不可用,但使用substringindexOf可以實現相同的效果。

3

我希望這個人會幫助你...這是我自己的I用於我的應用程序。當然,這仍然可以優化。我只是沒有時間去做...而且,我正在這裏工作在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; 
} 
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 
    } 

您可以使用拆分分隔符此方法。

1

在J2ME中沒有分割,但是可以使用此代碼進行分割。此代碼僅適用於1個simbol分隔符! 使用NetBeans.File \創建項目\ 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。 祝您好運!

0

另一種替代方案:

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