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