gpt4 book ai didi

java - 在流过滤器中包含 IgnoreCase 来计算字符串列表中某个特定单词的出现次数

转载 作者:行者123 更新时间:2023-11-29 08:21:20 25 4
gpt4 key购买 nike

我想计算java中字符串列表中单个单词的出现次数。看似这个任务很简单,但我遇到了以大写字母开头或包含,的单词的问题。或.在单词的末尾。我的方法如下:

public static Long countWordOccurence(List<String> wordList, String word) {

return wordList.stream()
.filter(s -> word.contains(s))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.values()
.stream()
.findFirst()
.orElse((long) -1);
}

上面的代码在正常情况下工作得很好,但在像Test,这样的字符串末尾的像逗号这样的极端情况下会出现问题。或以大写字母开头的字符串。

我正在分割我的字符串列表,例如:

Arrays.asList(TEXT_TO_PARSE.split(" ")); 

如果可能的话,我会很感激避免额外的依赖,但如果有必要,我不会鄙视。

如果您提出有关如何修复流中的过滤子句以正确计算字符串的建议,我将不胜感激。

最佳答案

您的代码存在几个基本问​​题。

  • .filter(s -> word.contains(s)) 执行子字符串搜索。与您的问题标题相反,它不会忽略大小写。尽管如此,仍然可以有不同内容的字符串通过过滤器

  • .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) 根据字符串的实际内容创建组。所以当多个不同的字符串通过前面的过滤器时,可能会存在多个组

  • .values().stream().findFirst():由于 groupingBy 创建了一个未指定排序的映射,因此这将选择任意组。除此之外,仅请求 count()

  • 是一种非常低效的方法
  • .orElse((long) -1)-1 是一个非常奇怪的计数后备,因为最自然的答案是没有匹配项时为“零”。

所以一个简单的解决方案是

public static long countWordOccurence(List<String> wordList, String word) {
return Collections.frequency(wordList, word);
}

用于计算区分大小写的匹配项或

public static long countWordOccurence(List<String> wordList, String word) {
return wordList.stream().filter(word::equalsIgnoreCase).count();
}

用于计数不区分大小写。

但那是xy problem无论如何。

当您想要计算字符串中某个单词的出现次数时,在执行实际搜索之前,无需将字符串拆分为单词并将数组转换为列表(顺便说一句,您可以 stream over an array directly ) .

你可以使用

public static long countWordOccurence(String sentence, String word) {
if(!word.codePoints().allMatch(Character::isLetter))
throw new IllegalArgumentException(word+" is not a word");
Pattern p = Pattern.compile("\\b"+word+"\\b");
return p.matcher(sentence).results().count();
}

区分大小写的匹配项的计数和

public static long countWordOccurence(String sentence, String word) {
if(!word.codePoints().allMatch(Character::isLetter))
throw new IllegalArgumentException(word+" is not a word");
Pattern p = Pattern.compile("\\b"+word+"\\b", Pattern.CASE_INSENSITIVE);
return p.matcher(sentence).results().count();
}

用于不区分大小写的匹配。 \b 模式表示单词边界,仅当搜索字符串实际上是单词时才有意义。因此,上述方法对此进行了预先测试,这也确保了该单词不包含可能被误解为正则表达式模式的字符。

results() 方法是在 Java 9 中引入的。This answer展示了在 Java 8 下创建此类流的解决方案,但是,对于计数出现次数这样的简单任务,另一种选择是不使用此处的流:

public static long countWordOccurence(String sentence, String word) {
if(!word.codePoints().allMatch(Character::isLetter))
throw new IllegalArgumentException(word+" is not a word");
Pattern p = Pattern.compile("\\b"+word+"\\b", Pattern.CASE_INSENSITIVE);
int count = 0;
for(Matcher m = p.matcher(sentence); m.find(); count++) {}
return count;
}

关于java - 在流过滤器中包含 IgnoreCase 来计算字符串列表中某个特定单词的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57867447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com