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