有没有比String.split()更有效的方式将字符串分解成单词?
我当前的项目需要搜索歌曲的歌词,这是Song对象中的一个String字段。为了帮助提高搜索效率,我使用String.split("[^a-zA-Z]");
创建歌曲对象时将歌词转储为一个集合,以创建一个String数组,然后添加到一个集合中。有没有比String.split()更有效的方式将字符串分解成单词?
是否有一种特殊的方式来将单词添加到一个集合中,而不需要创建数组的中间步骤?
你是否在特定歌曲中搜索某些单词?如果是这样,你可能不需要为此设置一个集合,你可以从你得到歌词的点开始搜索。你可以使用这个简单的正则表达式,这可能比分割字符串,把它变成一个集和查询设置,那么快的方式位:
public class RegexpExample {
public static void main(String[] args) {
String song = "Is this a real life? Is this just fantasy?";
String toFind = "is";
Pattern p = Pattern.compile(toFind, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(song);
while (m.find()) {
String found = m.group();
int startIndex = m.start();
int endIndex = m.end();
System.out.println(found + " at start " + startIndex + ", end " + endIndex);
//do something with this info...
}
}
它会输出这样的:
Is at start 0, end 2
is at start 5, end 7
Is at start 21, end 23
is at start 26, end 28
如果您在不同的歌曲搜索。然而,你可以使用StringBuilder
串连他们的歌词,然后调用StringBuilder#toString
与toString
方法的结果做整个操作
是否有添加的话到一组,而无需创建一个阵列的 中间步骤以特定的方式?
当然,你可以编写一个方法返回一个Iterator
对象,该对象每次输出一个单词。
但是像这样的东西真的不值得优化。你的数组很容易小到可以放进内存中,它的创建不会很昂贵,并且垃圾收集器将在之后清理它。
StringTokenizer st = new StringTokenizer("the days go on and on without you here");
HashSet<String> words = new HashSet<String>();
while (st.hasMoreTokens()) {
words.add(st.nextToken());
}
:它像这样'的StringTokenizer是保持兼容性的原因,尽管其使用在新代码气馁的遗留类。建议任何寻求此功能的人都使用String或java.util.regex包的拆分方法。'有趣的解决方案,尽管 – Jason 2010-11-08 21:08:44
我不知道效率,但或者,你可以做根据的Javadoc
import java.io.StringReader;
// ...
public static Set<String> getLyricSet(String lyrics) throws IOException {
StringReader sr = new StringReader(lyrics);
StringBuilder sb = new StringBuilder();
Set<String> set = new HashSet<String>();
int current;
// Read characters one by one, returns -1 when we're done
while ((current = sr.read()) != -1) {
if (Character.isWhitespace(current)) {
// End of word, add current word to set.
set.add(sb.toString());
sb = new StringBuilder();
} else {
sb.append((char) current);
}
}
// End of lyrics, add current word to set.
set.add(sb.toString());
sr.close();
return set;
}
当前项目正在运行搜索与特定单词不匹配的特定单词。您的解决方案似乎最适合短语搜索,这是下一个项目,我可能会实现您的答案。 – Jason 2010-11-09 13:02:22