我有一个程序,如果单词与列表中的单词匹配,我会在计数器中添加+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 =正确

OKEY =假

不错。 =错误

NICE,=错误

最佳答案

问题

这是您要解决的问题:


列出目标词
一句话
计算句子中目标词出现的次数


假设您要在句子中查找“ 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);
}

关于java - 为什么List.contain不匹配子字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56711254/

10-10 03:30