使用 Java 快速计算字符串中单词出现次数的方法
Fast way of counting number of occurrences of a word in a string using Java
我想使用 Java 以快速有效的方式查找单词在字符串中出现的次数。
单词被space分隔,我正在寻找完整的单词。
Example:
string: "the colored port should be black or white or brown"
word: "or"
output: 2
上面的例子,"colored"和"port"不算,但是"or"算了
我考虑过使用 substring() 和 contains() 并遍历字符串。但随后我们需要检查周围的 spaces,我认为这效率不高。另外 StringUtils.countMatches() 效率不高。
我尝试过的最好方法是将字符串拆分为 space 并遍历单词,然后将它们与给定的 word:
进行匹配
String string = "the colored port should be black or white or brown";
String[] words = string.split(" ");
String word = "or";
int occurrences = 0;
for (int i=0; i<words.length; i++)
if (words[i].equals(word))
occurrences++;
System.out.println(occurrences);
但我期待一些使用 Matcher 和 regex 的有效方法。
所以我测试了下面的代码:
String string1 = "the colored port should be black or white or brown or";
//String string2 = "the color port should be black or white or brown or";
String word = "or";
Pattern pattern = Pattern.compile("\s(" + word + ")|\s(" + word + ")|(" + word + ")\s");
Matcher matcher = pattern.matcher(string1);
//Matcher matcher = pattern.matcher(string2);
int count = 0;
while (matcher.find()){
match=matcher.group();
count++;
}
System.out.println("The word \"" + word + "\" is mentioned " + count + " times.");
它应该足够快,并为我提供了 string1 的正确答案,但不是 string2 的正确答案(已评论)。似乎需要对正则表达式进行一些更改。
有什么想法吗?
这个怎么样?假设 word
没有空格。
string.split("\s"+word+"\s").length - 1;
public class Test {
public static void main(String[] args) {
String str= "the colored port should be black or white or brown";
Pattern pattern = Pattern.compile(" or ");
Matcher matcher = pattern.matcher(str);
int count = 0;
while (matcher.find())
count++;
System.out.println(count);
}
}
我试验并评估了三个答案; split based and Matcher based(如问题中所述),以及 Collections.frequency() 基于(如@4castle 在上面的评论中提到的)。每次我测量一个循环重复 1000 万次的总时间。因此,基于 split 的答案往往是 最有效的方式:
String string = "the colored port should be black or white or brown";
String[] words = string.split(" ");
String word = "or";
int occurrences = 0;
for (int i=0; i<words.length; i++)
if (words[i].equals(word))
occurrences++;
System.out.println(occurrences);
然后是基于 Collections.frequency() 的答案,时间稍长 运行(慢 ~5%):
String string = "the colored port should be black or white or brown or";
String word = "or";
int count = Collections.frequency(Arrays.asList(string.split(" ")), word);
System.out.println("The word \"" + word + "\" is mentioned " + count + " times.");
基于 Matcher 的 解决方案(在问题中提到)要慢很多(运行 时间的 5 倍)。
我想使用 Java 以快速有效的方式查找单词在字符串中出现的次数。
单词被space分隔,我正在寻找完整的单词。
Example:
string: "the colored port should be black or white or brown"
word: "or"
output: 2
上面的例子,"colored"和"port"不算,但是"or"算了
我考虑过使用 substring() 和 contains() 并遍历字符串。但随后我们需要检查周围的 spaces,我认为这效率不高。另外 StringUtils.countMatches() 效率不高。
我尝试过的最好方法是将字符串拆分为 space 并遍历单词,然后将它们与给定的 word:
进行匹配String string = "the colored port should be black or white or brown";
String[] words = string.split(" ");
String word = "or";
int occurrences = 0;
for (int i=0; i<words.length; i++)
if (words[i].equals(word))
occurrences++;
System.out.println(occurrences);
但我期待一些使用 Matcher 和 regex 的有效方法。
所以我测试了下面的代码:
String string1 = "the colored port should be black or white or brown or";
//String string2 = "the color port should be black or white or brown or";
String word = "or";
Pattern pattern = Pattern.compile("\s(" + word + ")|\s(" + word + ")|(" + word + ")\s");
Matcher matcher = pattern.matcher(string1);
//Matcher matcher = pattern.matcher(string2);
int count = 0;
while (matcher.find()){
match=matcher.group();
count++;
}
System.out.println("The word \"" + word + "\" is mentioned " + count + " times.");
它应该足够快,并为我提供了 string1 的正确答案,但不是 string2 的正确答案(已评论)。似乎需要对正则表达式进行一些更改。
有什么想法吗?
这个怎么样?假设 word
没有空格。
string.split("\s"+word+"\s").length - 1;
public class Test {
public static void main(String[] args) {
String str= "the colored port should be black or white or brown";
Pattern pattern = Pattern.compile(" or ");
Matcher matcher = pattern.matcher(str);
int count = 0;
while (matcher.find())
count++;
System.out.println(count);
}
}
我试验并评估了三个答案; split based and Matcher based(如问题中所述),以及 Collections.frequency() 基于(如@4castle 在上面的评论中提到的)。每次我测量一个循环重复 1000 万次的总时间。因此,基于 split 的答案往往是 最有效的方式:
String string = "the colored port should be black or white or brown";
String[] words = string.split(" ");
String word = "or";
int occurrences = 0;
for (int i=0; i<words.length; i++)
if (words[i].equals(word))
occurrences++;
System.out.println(occurrences);
然后是基于 Collections.frequency() 的答案,时间稍长 运行(慢 ~5%):
String string = "the colored port should be black or white or brown or";
String word = "or";
int count = Collections.frequency(Arrays.asList(string.split(" ")), word);
System.out.println("The word \"" + word + "\" is mentioned " + count + " times.");
基于 Matcher 的 解决方案(在问题中提到)要慢很多(运行 时间的 5 倍)。