2013-05-10 40 views
-1

所以該方法需要兩個參數,第一個是您將要分割的字符串,第二個是分隔符(分割的地方)。 所以如果我傳入「abc | def」作爲第一個參數並且「|」作爲第二我應該得到一個List返回「abc,def」我遇到的問題是,我的if語句要求分隔符是在當前字符串被訪問。我想不出更好的條件,有什麼幫助?在指定點分割字符串

public List<String> splitIt(String string, String delimiter){ 
    //create and init arraylist. 
    List<String> list = new ArrayList<String>(); 
    //create and init newString. 
    String newString=""; 
    //add string to arraylist 'list'. 
    list.add(string); 
    //loops through string. 
    for(int i=0;i<string.length();i++){ 
     newString += string.charAt(i); 
     if(newString.contains(delimiter)){ 
      //list.remove(string); 
      list.add(newString.replace(delimiter, "")); 
      newString=""; 
     } 
    } 
    return list; 
} 
+0

當在SO上發佈問題時,請提供適當縮進的基本禮貌(注意:TAB字符不能正常工作),並使用預覽驗證您的問題是否格式正確。 – hyde 2013-05-10 15:25:15

+0

如果字符串多於一個字符,則使用'indexOf'在'String'中查找您的分隔符。 – 2013-05-10 15:32:26

+0

這個問題是如何不同於你的[上一個](http://stackoverflow.com/questions/16461337/how-to-separate-specific-elements-in-string-java),除去'list.remove(string );'和'list.add(newString);'在當前代碼中?另外如何使用'string.indexOf(delimiter)'來確定字符串是否包含分隔符,以及'string.substring(start,end)'來獲得有趣的部分? – Pshemo 2013-05-10 15:34:21

回答

0

String類已經支持split方法,我認爲確實你正在尋找到底該怎麼做。

String[] s = "abc|def".split("\\|"); 
    List<String> list = Arrays.asList(s); 

如果你想自己做,代碼可能是這個樣子:

char delim = "|".charAt(0);  
    String s = "abc|def|ghi"; 
    char[] chars = s.toCharArray(); 
    StringBuilder sb = new StringBuilder(); 
    List<String> list = new ArrayList<String>(); 
    for(char c: chars){ 
    if (c == delim){ 
     list.add(sb.toString()); 
     sb = new StringBuilder(); 
    } 
    else{ 
     sb.append(c); 
    } 
    } 
    if (sb.length() > 0) list.add(sb.toString()); 
    System.out.println(list); 
+0

返回一個'String []',其元素可以在List中移動。 – 2013-05-10 15:23:17

+0

我這樣做是爲了學習的好處,我不想使用內置的拆分方法,謝謝:)。 – user2069328 2013-05-10 15:26:27

0

改變你的整個方法。

public List<String> splitIt(String string, String delimiter){ 
    String[] out = string.split(delimiter); 
     return Arrays.asList(out); 
    } 
+2

我這樣做是爲了學習的好處,我不想使用內置的拆分方法,謝謝:)。 – user2069328 2013-05-10 15:25:55

0

因爲你是通過串迭代,你是否應該基於字符您正在檢查,而不是調用,包含了每個時間:

public List<String> splitIt(String string, String delimiter){ 
    //create and init arraylist. 
    List<String> list = new ArrayList<String>(); 
    //create and init newString. 
    String newString=""; 
    //add string to arraylist 'list'. 
    list.add(string); 
    //loops through string. 
    int lastDelimiter = 0; 
    for (int i=0; i<string.length(); i++) { 
     if (delimiter.equals("" + string.charAt(i))) { 
      list.add(string.substring(lastDelimiter, i)); 
      lastDelimiter = i + 1; 
     } 
    } 
    if (lastDelimiter != string.length()) 
     list.add(string.substring(lastDelimiter, string.length())); 

    return list; 
} 

對於學習的緣故,我想你原始嘗試適合遞歸解決方案。在這種情況下,一般的想法是:

  1. 如果在字符串中沒有分隔符,它不爲空,返回字符串作爲唯一的元素在一個新的列表
  2. 否則
    1. 找到定界符
    2. 的第一次出現中提取從開始字符串到定界符,稱之爲「發現」
    3. 除去定界符
    4. 遞歸調用該方法,傳遞給它的剩餘字符串和分隔符
    5. 追加「發現」的名單,從4號返回,返回列表
1

Badshaah和使用內置函數split(正則表達式)拆分cmvaxter代碼不會工作。當你傳遞「|」作爲分隔符「sam | ple」,它不會被分割爲[sam,ple],因爲(|,+,*,...)全部用於正則表達式以用於其他目的。

和u能以人格檢查字符,如果分隔符是一個字符

loop(each char) 
    if(not delim) 
     append to list[i] 
    else 
     increment i, discard char 

學習目的,可能需要用C或C++(即使他們已經strtok的分割字符串),以提高效益分析或修改不同的東西。 [可以用不同的正則表達式分割]

最好使用現有的系統庫和函數。

如果u想使用你的函數做這樣的事情

寫這些功能自己

findpos(delim) // gives position of delimiter found in string 
substring(pos,len) //len:size of delimiter 
getlist(String str,String delim) 
    //for each delim found use substring and append to list 

使用一些模式匹配KMP喜歡什麼你知道的算法。

+0

更新了我的地雷以逃避|。接得好... – cmbaxter 2013-05-10 15:52:07