为什么List.contain不匹配子字符串?

时间:2019-06-21 22:56:24

标签: java

我有一个程序,如果单词与列表中的单词匹配,我会在计数器中添加+1

例如,如果我有[OK,NICE]这个词,而我正在看一个词(句子是用空格隔开的话)。

在拆分中,我不想放置逗号和点的选项,我现在只想要一个这样的空格

private static int contWords(String line, List<String> list) {

String[] words= line.split(" ");
int cont = 0;

for (int i = 0; i < words.length; i++) {
    if (list.contains(words[i].toUpperCase())) {
        cont++;
    }
}
return cont;
}

这将是一个单词示例,该单词不会向计数器添加+1,并且应该

OK = true

OKEY =假

好。 =假

好,=假

1 个答案:

答案 0 :(得分:2)

问题

这是您要解决的问题:

  • 获取目标词列表
  • 一个句子
  • 统计句子中目标词的出现次数

假设您要在句子中查找“ OK”和“ NICE”,并且句子为“这很好,很好!”,出现的次数应为2。

选项

您有几种选择,我将向您展示使用Streams

的方式

解决方案

private static int countWords(String sentence, List<String> targets) {
    String[] words = sentence.split(" ");
    return (int) Stream.of(words)
            .map(String::toUpperCase)
            .filter(word -> targets.stream().anyMatch(word::contains))
            .count();
}

它如何工作?

首先,您输入一个句子,然后将其拆分为一个数组(您已经完成了此操作)

然后,我们获取数组,然后使用map将每个单词映射为其大写形式。这意味着每个词现在都大写了。

然后,使用filter仅将存在的单词作为子字符串保留在target列表中。

然后,我们只返回计数。

更深入?

我可以详细了解一下此语句的含义:

.filter(word -> targets.stream().anyMatch(word::contains))

word -> ...是一个接受word并输出boolean值的函数。这很有用,因为对于每个单词,我们都想知道它是否是目标的子字符串。

然后,该函数将计算targets.stream().anyMatch(word::contains)并遍历目标流,并告诉我们其中的任何单词是否包含(作为子字符串)我们要过滤的单词。

忍者编辑:

在您最初的问题中,如果句子是“这是Okey,不错!”并且目标列表为["OK", "OKEY"],它将返回2。

如果这是您想要的行为,则可以将方法更改为:

private static int countWords(String sentence, List<String> targets) {
    String[] words = sentence.split(" ");
    return Stream.of(words)
            .map(String::toUpperCase)
            .map(word -> targets.stream().filter(word::contains).count())
            .reduce(0L, Long::sum)
            .intValue();
} 

忍者编辑:

根据注释中提出的另一个问题,您可以执行以下操作,将所有匹配的单词替换为"***"

private static String replaceWordsWithAsterisks(String sentence, List<String> targets) {
    String[] words = sentence.split(" ");
    List<String> processedWords = Stream.of(words)
            .map(word -> targets.stream().anyMatch(word.toUpperCase()::contains) ? "***" : word)
            .collect(Collectors.toList());

    return String.join(" ", processedWords);
}