【问题标题】:Splitting string at specified point [duplicate]在指定点拆分字符串[重复]
【发布时间】:2013-05-05 08:00:25
【问题描述】:

所以该方法有两个参数,第一个是您将要拆分的字符串,第二个是分隔符(在哪里拆分)。 所以如果我传入“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;
}

【问题讨论】:

  • 在 SO 上发布问题时,请注意正确缩进(注意:TAB 字符不能正常工作),并使用预览来验证您的问题格式是否正确。跨度>
  • 如果String 中的分隔符不止一个字符,请使用indexOf 查找。
  • 除了在当前代码中删除 list.remove(string);list.add(newString); 之外,这个问题与您的 previous one 有何不同?另外如何使用string.indexOf(delimiter) 来确定字符串是否包含分隔符,并使用string.substring(start,end) 来获取有趣的部分?

标签: java string arraylist split delimiter


【解决方案1】:

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);

【讨论】:

  • 返回一个String[],您可以将其元素推入List
  • 我这样做是为了学习,我不想使用内置的拆分方法,谢谢:)。
【解决方案2】:

使用内置函数 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 或你知道的。

【讨论】:

  • 更新了我的以逃避 |。很好的收获...
【解决方案3】:

由于您正在遍历字符串,因此您的 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 返回的列表中,并返回该列表

【讨论】:

    【解决方案4】:

    将您的整个方法更改为。

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

    【讨论】:

    • 我这样做是为了学习,我不想使用内置的拆分方法,谢谢:)。
    猜你喜欢
    • 2017-04-09
    • 2010-11-03
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 2017-07-22
    • 2011-07-06
    • 2011-09-03
    • 2016-03-15
    相关资源
    最近更新 更多