如何检查字符串是否具有List中的子字符串?

Swa*_*ale 8 java iteration substring

我正在寻找检查字符串是否包含关键字列表中的子字符串的最佳方法.

例如,我创建一个这样的列表:

List<String> keywords = new ArrayList<>();
keywords.add("mary");
keywords.add("lamb");

String s1 = "mary is a good girl";
String s2 = "she likes travelling";
Run Code Online (Sandbox Code Playgroud)

字符串s1具有来自关键字的"mary",但字符串s2没有它.所以,我想定义一个方法:

boolean containsAKeyword(String str, List<String> keywords)
Run Code Online (Sandbox Code Playgroud)

哪里containsAKeyword(s1, keywords)会返回true但containsAKeyword(s2, keywords)会返回false.即使有一个子字符串匹配,我也可以返回true.

我知道我可以遍历关键字列表并在列表中的每个项目上调用str.contains(),但我想知道是否有更好的方法来迭代完整列表(避免O(n)复杂性)或者Java为此提供了任何内置方法.

Ada*_*331 10

我建议迭代整个列表.值得庆幸的是,您可以使用增强的for循环:

for(String listItem : myArrayList){
   if(myString.contains(listItem)){
      // do something.
   }
}
Run Code Online (Sandbox Code Playgroud)

编辑所知,你必须以某种方式迭代列表.想想看,如果不通过它,你怎么知道列表中包含哪些元素?

编辑2

我能看到迭代快速运行的唯一方法是执行上述操作.这是设计的方式,一旦找到匹配就会提前中断,而无需进一步搜索.您可以在循环结束时放置返回false语句,因为如果您在没有找到匹配项的情况下检查了整个列表,那么显然没有.这是一些更详细的代码:

public boolean containsAKeyword(String myString, List<String> keywords){
   for(String keyword : keywords){
      if(myString.contains(keyword)){
         return true;
      }
   }
   return false; // Never found match.
}
Run Code Online (Sandbox Code Playgroud)

编辑3

如果您正在使用Kotlin,则可以使用以下any方法执行此操作:

val containsKeyword = myArrayList.any { it.contains("keyword") }
Run Code Online (Sandbox Code Playgroud)


Tru*_*ati 8

现在您可以使用 Java 8 流来实现此目的:

keywords.stream().anyMatch(keyword -> str.contains(keyword));
Run Code Online (Sandbox Code Playgroud)


fda*_*dam 5

在 JDK8 中你可以这样做:

public static boolean hasKey(String key) {
   return keywords.stream().filter(k -> key.contains(k)).collect(Collectors.toList()).size() > 0;
}

hasKey(s1); // prints TRUE
hasKey(s2); // prints FALSE
Run Code Online (Sandbox Code Playgroud)