2008-10-14 51 views
14

Làm cách nào để tách chuỗi trong J2ME theo cách hiệu quả?Làm cách nào để tách các chuỗi trong J2ME?

Có một StringTokenizer hoặc String.split(String regex) trong ấn bản tiêu chuẩn (J2SE), nhưng chúng không có trong ấn bản vi mô (J2ME, MIDP).

+1

Một chút của một mặt lưu ý, không giúp với J2ME, nhưng có thể giúp đỡ người khác trong thời gian tới ... Thật không may, StringTokenizer đã bị phản đối J2SE. Thay thế được đề xuất là chỉ sử dụng phương thức tách chuỗi. Thay vì không may, StringTokenizer thực hiện cho một số mã trơn đẹp. Thay đổi nó xung quanh để chỉ sử dụng phương thức tách chuỗi làm cho mã clunkier. Điều đó dường như là cách Java mặc dù, không dùng các tính năng tốt và nói với mọi người chỉ cần sử dụng những người clunky thay thế. –

Trả lời

11

Có một vài triển khai của lớp StringTokenizer cho J2ME. Đây từng Ostermiller rất có thể sẽ bao gồm các chức năng bạn cần

Xem thêm this page on Mobile Programming Pit Stop cho một số sửa đổi và các ví dụ sau:

String firstToken; 
StringTokenizer tok; 

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

Cảm ơn, đó là chính xác những gì tôi cần. – Spoike

+0

liên kết chết cho thư viện. Bạn có thể cung cấp một công việc. –

3

Không có phương thức tích hợp để tách chuỗi. Bạn phải tự viết nó bằng cách sử dụng String.indexOf()String.substring(). Không khó.

+2

Có, nhưng nó sẽ là bộ nhớ hiệu quả? String.substring() sẽ tạo ra các chuỗi mới, sẽ hog bộ nhớ cho đến khi thu thập rác. – Spoike

+0

StringTokenizer.nextToken() chứa "return string.subString (...)" nội bộ vì vậy tôi không nghĩ rằng bạn đang tồi tệ hơn ... – Cowan

+0

Substring sử dụng một cấu trúc riêng cho String mà chia sẻ mảng (không thay đổi) , vì vậy có - nó sẽ là bộ nhớ hiệu quả. – ddimitrov

2

Điều đó phụ thuộc vào chính xác những gì bạn muốn đạt được, nhưng các chức năng String.substring() sẽ được ở đâu đó:

String myString = "Hello World"; 

này sẽ in ra chuỗi con bắt đầu từ chỉ số 6 đến phần cuối của chuỗi :

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

này sẽ in ra chuỗi con bắt đầu từ chỉ số 0 cho đến khi chỉ số 5:

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

Output của tất cả các mã trên:

 
World 
Hello 

Kết hợp điều này với các chức năng chuỗi khác (indexOf(). vv) để đạt được hiệu quả mong muốn!

Đọc lại câu hỏi của bạn, có vẻ như bạn có thể đang tìm kiếm String.split(). Điều này sẽ tách chuỗi đầu vào của bạn thành một mảng các chuỗi dựa trên một regex đưa ra:

String myString = "Hi-There-Gang"; 

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

này sẽ cho kết quả trong mảng splitStrings chứa ba chuỗi, "Hi", "There""Gang".

Đọc lại câu hỏi của bạn một lần nữa, String.split không có sẵn trong J2ME, nhưng hiệu ứng tương tự có thể đạt được với substringindexOf.

3

String.split (...) có sẵn trong J2SE, nhưng không có J2ME.
Bạn bắt buộc phải viết thuật toán của riêng mình: related post with sample solution.

+0

liên kết hiện không còn hoạt động – Abdull

3

Tôi hy vọng điều này sẽ giúp bạn ... Đây là thực hiện riêng của tôi được sử dụng trong ứng dụng của tôi. Tất nhiên điều này vẫn có thể được tối ưu hóa. tôi chỉ không có thời gian để làm điều đó ... và cũng có thể, tôi đang làm việc trên StringBuffer ở đây. Chỉ cần cấu trúc lại để có thể sử dụng String thay thế.

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, dưới đây là cách bạn có thể sử dụng mã ... Chuỗi [] elements = split (StringBuffer mới ("Hello | World"), "|"); hoặc Chuỗi [] elements = split (StringBuffer mới ("HelloblahWorld"), "blah"); cả hai lợi nhuận {"Xin chào", "Thế giới"} – 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 
    } 

Bạn có thể sử dụng phương pháp này để tách một dấu phân cách.

1

Trong J2ME không phân chia, nhưng bạn có thể sử dụng mã này để tách. Mã này chỉ hoạt động với một dấu phân cách simbol !!! Sử dụng NetBeans.File \ Create Project \ Java ME \ MobileApplication \ Đặt tên dự án (tách) \ Set checkmark.Delete tất cả mã trong (Midlet.java) của bạn .Sao chép mã này và quá khứ trong (Midlet.java) của bạn.

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




} 

Các phần tử được chia nằm trong mảng gọi là (out). Ví dụ: [1]: Xin chào. Chúc may mắn !!!

0

Một giải pháp thay thế:

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; 
} 
Các vấn đề liên quan