我有一个程序,如果单词与列表中的单词匹配,我会在计数器中添加+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 =假
好。 =假
好,=假
答案 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);
}