2014-01-11 31 views
0

假设我们想写一个方法来接收整个图书的字符串和任意单字符分隔符来分隔字符串并返回一个字符串数组。我想出了下面的实现(Java)的(假设无定界符连续等)Split字符串由任意字符分隔

ArrayList<String> separater(String book, char delimiter){ 
ArrayList<String> ret = new ArrayList<>(); 
String word =""; 

    for (int i=0; i<book.length(), ++i){ 
     if (book.charAt(i)!= delimiter){ 
      word += book.charAt(i); 
     } else { 
      ret.add(word); 
      word = ""; 
     } 
    } 
    return ret; 
} 

问:我不知道是否有任何办法,把杠杆String.split()更短的解决方案?因为我无法找到一种为任意字符分隔符定义一般正则表达式的常用方法。

String.split("\\.") if the delimiter is '.' 
String.split("\\s+"); if the delimiter is ' ' // space character 

That measn I cold找不到从输入字符分隔符生成方法split()的输入正则表达式的一般方法。有什么建议么?

+0

???那么你想要哪些语言的答案参考? – alvas

+0

调用book.split(“”+分隔符)有什么问题?也许我不完全理解这个问题 – Alejandro

+0

@alvas Java我更喜欢 –

回答

2
String[] array = string.split(Pattern.quote(String.valueOf(delimiter))); 

这就是说,番石榴分流器比String.split()更通用,性能更好。

并且关于你的方法的一个注释:连接到一个循环中的String是非常低效的。由于字符串是不可变的,它会产生大量的临时字符串和StringBuilders。您应该使用StringBuilder。

+0

我完全同意你关于使用字符串而不是StringBuilder,我只是为了简单而使用字符串。但有趣的是,一位Amazone的采访者相信java编译器会照顾它! –

+0

编译器会为代码处理它,比如'String s =“hello”+ title +“”+ firstName +“”+ lastName;'。但不能附加在循环中。 –

+0

我刚刚得到了关于使用Guava Splitter(btw我不知道那是什么)的建议的观点,因为你的解决方案不适用于反斜杠'\\'或甚至string.split(Pattern.quote(“\\”)) )并引发java.util.regex.Pattern.error(Unknown Source)错误 –