使用 equals() 查看 String 是否具有 LinkedList 中提供的关键字

See if a String has keywords provided in LinkedList with equals()

鉴于这种情况,我想看看字符串是否包含所有给定的关键字,至少 once/word。 我的 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;

预计 return 正确

你为什么不这样做:

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

    return true;
}

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

check(toCheck, keyWords);

用户 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);

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

  • 不分顺序,
  • 无论重复多少次(只要存在一次)。

由于集合针对 contains 方法进行了优化(对于 HashSet contains 接近 O(1) 时间复杂度),它看起来是这种情况下的有效选择。

另外 Set 提供了 Set#containsAll​(Collection) 方法,因为 LinkedList 是一个 Collection 我们可以像

一样使用它

因此您的代码可以如下所示:

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);