2008-10-14 6 views
14

효과적인 방법으로 문자열을 J2ME에서 분할하는 방법은 무엇입니까?J2ME에서 문자열을 분할하는 방법은 무엇입니까?

표준 버전 (J2SE)에는 StringTokenizer 또는 String.split(String regex)가 있지만 마이크로 버전 (J2ME, MIDP)에는 없습니다.

+1

보조 노트의 비트가, J2ME에 도움이되지 않지만, 미래에 다른 사람을 도울 수 ... 불행하게도 있고 StringTokenizer는 J2SE에서 더 이상 사용되지 않습니다. 제안 된 대체 방법은 문자열 분할 방법을 사용하는 것입니다. 오히려 유감스럽게도, StringTokenizer는 멋진 매끄러운 코드를 만들었습니다. String split 메소드를 사용하기 위해이를 변경하면 더욱 까다로운 코드가 생성됩니다. 그것은 Java의 방법 인 것처럼 보이지만, 좋은 기능을 사용하지 말고 대신 사람들이 쓸데없는 것들을 사용하도록하십시오. –

답변

11

J2ME 용 StringTokenizer 클래스의 구현이 몇 가지 있습니다. 나는 ... 이것은 내 자신의 구현 난입니다이 하나가 당신을 도울 것입니다 희망

String firstToken; 
StringTokenizer tok; 

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

감사합니다. – Spoike

+0

라이브러리의 죽은 링크입니다. 당신은 일할 수 있습니까? –

3

문자열을 분할하는 기본 제공 방법이 없습니다. String.indexOf()String.substring()을 사용하여 직접 작성해야합니다. 어렵지 않다.

정확히 당신이 달성하려는 작업에 따라 다르지만 기능 String.substring()가 어딘가에있을 것
+2

예,하지만 효과적일까요? String.substring()은 가비지가 수집 될 때까지 메모리를 늘리는 새로운 문자열을 생성합니다. – Spoike

+0

StringTokenizer.nextToken()에는 내부적으로 "return string.subString (...)"이 포함되어 있으므로 더 나쁜 것으로 생각하지 않습니다. – Cowan

+0

하위 문자열은 (가변적 인) char 배열을 공유하는 String에 대해 private constructof를 사용합니다 , 그렇습니다 - 그것은 효율적으로 메모리가 될 것입니다. – ddimitrov

2

:

String myString = "Hello World"; 

이 문자열의 끝 인덱스 6 일부터 시작되는 문자열을 인쇄합니다 :

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

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

이 색인 5까지 인덱스 0에서 시작하는 문자열을 인쇄합니다 위의 모든 코드

출력 :

 
World 
Hello 

은 다른 문자열 함수 (indexOf() 이것을 결합합니다. 등) 원하는 효과를 얻을 수 있습니다!

귀하의 질문을 다시 읽기, 그것은 마치 String.split()을 찾고있는 것처럼 보입니다. 이것은 주어진 정규식에 기초 문자열 배열로 입력 문자열을 분할한다 :

String myString = "Hi-There-Gang"; 

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

이 세 문자열 "Hi", "There""Gang" 함유 splitStrings 배열 될 것이다.

다시 질문을 읽으십시오. String.split은 J2ME에서는 사용할 수 없지만 substringindexOf으로 동일한 효과를 얻을 수 있습니다.

3

String.split (...)은 J2SE에서 사용할 수 있지만 J2ME에서는 사용할 수 없습니다.
당신은 자신의 알고리즘을 작성해야합니다 : related post with sample solution.

+0

링크가 현재 작동하지 않습니다. – Abdull

3

: Ostermiller에 의해이 사람은 당신이

페이지의 일부 수정에 대한 this page on Mobile Programming Pit Stop 다음과 같은 예를 필요로하는 기능을 포함 가능성이 가장 높은 것 내 응용 프로그램에 사용됩니다. 물론 이것은 여전히 ​​최적화 될 수 있습니다. 난 그냥 할 시간이 없어 ... 그리고 또한, 여기 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; 
} 
+0

btw, 코드를 사용할 수있는 방법은 다음과 같습니다. String [] elements = split (새 StringBuffer ("Hello | World"), "|"); 또는 String [] elements = split (새 StringBuffer ("HelloblahWorld"), "blah"); 둘 다 { "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 
    } 

당신은 구분 기호를 분할하는이 방법을 사용할 수 있습니다.

1

J2ME에서는 분할이 없지만이 코드를 분할에 사용할 수 있습니다.이 코드는 단 하나의 simbol 구분 기호로 작동합니다. NetBeans.File 사용 \ Project 만들기 \ Java ME \ MobileApplication \ 프로젝트 이름 설정 (split) \ Checkmark.Detlete (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)이라고하는 배열에 있습니다. 예 : 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; 
} 
관련 문제