0

鉴于这种情况,我想看看字符串是否包含所有给定的关键字,至少一次/单词。我的 for 循环似乎没有这样做,所以我很感兴趣是否有另一种方法可以尝试解决问题。

LinkedList<String> keyWords = new LinkedList<String>();
keyWords.add("amet");
keyWords.add("eiusmod");

String toCheck = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";

String[] toCheckWords = toCheck.split(" ");

for (int i=0; i<toCheckWords.length(); i++) {
  if (keyWords.get(i).equals(toCheckWords[i])
     return true;
}
return false;

预计返回真

4

3 回答 3

2

你为什么不这样做:

public static boolean check(String input, List<String> keywords) {
    for (String keyword : keywords)
        if (!input.contains(keyword))
            return false;

    return true;
}

在你的情况下你会这样称呼:

check(toCheck, keyWords);
于 2020-04-16T19:32:59.647 回答
2

toCheck句子分成单词后将它们存储起来,Set因为您的目标是检查句子是否包含关键字

  • 不管顺序,
  • 无论重复次数如何(只要它存在一次)。

由于 Sets 针对contains方法进行了优化(因为 HashSetcontains的时间复杂度接近 O(1)),所以它看起来是这种场景的有效选择。

Set提供了方法Set#containsAll​(Collection),因为我们可以像这样使用它LinkedListCollection

所以你的代码看起来像:

LinkedList<String> keyWords = new LinkedList<String>();
keyWords.add("amet");
keyWords.add("eiusmod");

String sentence = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
Set<String> wordsInSentence = new HashSet<>(List.of(sentence.trim().split("[ ,.!?]+")));

boolean result = wordsInSentence.containsAll(keyWords);
于 2020-04-16T19:59:11.510 回答
0

用户 Schred 提供了一个解决问题的解决方案,并且完全有效。值得指出的是,如果您不受 LinkedList 的约束,这是使用 Set,特别是 HashSet 的绝佳机会。如果单词不区分大小写,这将不起作用。

Set<String> keywords = new HashSet<>(Arrays.asList("amet", "eiusmod"));

String toCheck = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";

boolean contains = Stream.of(toCheck.split(" ")).allMatch(keywords::contains);
于 2020-04-16T19:40:03.367 回答