2013-05-10 45 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