在指定点分割字符串

时间:2013-05-10 15:21:03

标签: java string arraylist split delimiter

所以该方法有两个参数,第一个是你要拆分的字符串,第二个是分隔符(在哪里拆分)。 所以如果我传入“abc | def”作为第一个参数和“|”作为第二个我应该得到一个返回“abc,def”的List,我遇到的问题是我的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;
}

4 个答案:

答案 0 :(得分:1)

使用内置函数split(regex)进行拆分的Badshaah和cmvaxter代码将不起作用。当你通过“|”作为分隔符“sam | ple”它不会被分割为[sam,ple]因为(|,+,*,...)都在正则表达式中用于其他目的。

如果分隔符是字符

,你可以逐个字符地检查
loop(each char)
   if(not delim)
       append to list[i]
   else
       increment i, discard char

学习目的在c或c ++中可能需要它(甚至他们已经开始分裂字符串)以提高效率或修改不同的东西。 [可能不同地使用正则表达式进行拆分]

最好使用现有的系统库和函数。

如果你想使用你的函数做类似的事情

  

自己编写这些功能

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或你知道的东西。

答案 1 :(得分: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);

答案 2 :(得分:0)

将整个方法更改为。

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

答案 3 :(得分:0)

由于您正在遍历字符串,因此if应该基于您正在检查的字符,而不是每次都调用contains:

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. 从开头到分隔符提取字符串,称之为'found'
    3. 删除分隔符
    4. 以递归方式调用此方法,并将其余字符串和分隔符
    5. 传递给它
    6. 将'found'附加到#4返回的列表中,并返回该列表