当前位置: 首页 > 知识库问答 >
问题:

流筛选器中的ContainsIgnoreCase,用于计算字符串列表中某个特定单词的出现次数

尹赞
2023-03-14

我想在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、这样的字符串末尾的coma这样的拐角情况,或者以大写字母开头的字符串,就会出现问题。

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

对于如何修复流中的filter子句以正确计数字符串,我将不胜感激。

共有1个答案

翟淮晨
2023-03-14

您的代码有几个基本问题。

>

  • .filter(s->word.contains(s))执行子字符串搜索。与你的问题的标题相反,它没有忽略大小写。但是,可以有不同内容的字符串通过筛选器

    .collect(collectors.groupingby(function.identity(),collectors.counting()))根据字符串的实际内容创建组。因此,当多个不同的字符串通过前一个筛选器时,可能存在多个组

    所以一个直接的解决方案是

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

    不区分大小写的计数。

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

    java9中引入了results()方法。这个答案展示了在Java8下创建这样一个流的解决方案,但是,对于像计算出现次数这样简单的任务,替代方案是在这里不使用流:

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

  •  类似资料:
    • 问题内容: 如何计算一个单词出现在字符串列表中的次数? 例如: 单词“句子”的结果是2 问题答案: 使用一个对象并在空白处分割单词。您可能还希望小写单词,并删除标点符号: 或使用仅与单词字符匹配的正则表达式: 现在,您有了一本包含每个单词计数的字典。 演示:

    • 问题内容: 我是Java字符串的新手,问题是我想计算字符串中特定单词的出现次数。假设我的字符串是: 现在,我也不想拆分它,所以我想搜索一个“雄猫”这个词。它在我的字符串中出现了两次! 我正在尝试的是: 它给了我46个计数器的价值!那么解决方案是什么? 问题答案: 您可以使用以下代码: 演示版 它匹配。 表示在找到匹配项时执行循环内给出的任何操作。并且我将by 的值递增,因此很显然,这给出了一个字符

    • 问题内容: 我有一个大的文本文件正在读取,因此我需要找出几个单词出现的次数。例如,单词。我正在逐行执行此操作,每一行都是一个字符串。 我要确保我只算合法的-在中起不到作用。这意味着我知道我需要以某种方式使用正则表达式。到目前为止,我正在尝试的是: 我意识到正则表达式目前可能不正确,但我尝试过不这样做,而只是尝试查找单词的出现,并且我也得到了错误的数字。我给人的印象是,它将字符串分割成一个数组,并且

    • 我需要返回一个字典,该字典计算预定列表中每个字母出现的次数。问题是我需要把大小写字母都算成一样,所以我不能用.low或.uper。 因此,例如,如果“t”是要搜索的字母,“This is a Python String”应该返回{nt':3}。 这是我目前所掌握的... 其中'letters'是条件,fullText是我正在搜索的字符串。 这里很明显的问题是,如果测试是“t”而不是“t”,我的代码

    • 从目标字符串的列表中查找字符串出现次数的最佳方法是什么?具体来说,我有一个列表: 我想进行优化以最小化速度和内存使用,如果这有所作为的话。就大小而言,我预计最终可能包含数百个子字符串。

    • 问题内容: 我认为我已经很好地理解了这一点,但我认为该陈述是错误的。怎么说包含空格,加1。 编辑: 我发现(感谢Blender)可以用更少的代码来做到这一点: 问题答案: 使用方括号,而不是括号: 或: 您也可以使用: