-1

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

4 回答 4

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++ 中(即使他们已经 strtok 来拆分字符串)以提高效率或以不同的方式修改某些东西。[不使用正则表达式可能会有所不同]

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

如果您想使用您的功能,请执行以下操作

自己写这些函数

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

于 2013-05-10T15:50:19.017 回答
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);
于 2013-05-10T15:22:03.787 回答
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. 将 'found' 附加到从 #4 返回的列表中,并返回该列表
于 2013-05-10T15:30:34.597 回答
0

将您的整个方法更改为。

public List<String> splitIt(String string, String delimiter){
    String[] out = string.split(delimiter);
      return Arrays.asList(out);
   }
于 2013-05-10T15:24:30.537 回答