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

时间:2014-11-24 17:25:36

标签: java substring iteration

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

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

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

String s1 = "mary is a good girl";
String s2 = "she likes travelling";

字符串s1有&#34; mary&#34;从关键字,但字符串s2没有它。所以,我想定义一个方法:

boolean containsAKeyword(String str, List<String> keywords)

containsAKeyword(s1, keywords)返回true但containsAKeyword(s2, keywords)将返回false。即使存在单个子串匹配,我也可以返回true。

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

8 个答案:

答案 0 :(得分:9)

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

for(String listItem : myArrayList){
   if(myString.contains(listItem)){
      // do something.
   }
}

编辑充分利用我的知识,您必须以某种方式迭代列表。想一想,如果不通过它,您将如何知道列表中包含哪些元素?

编辑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.
}

编辑3

如果您使用的是Kotlin,可以使用any方法执行此操作:

val containsKeyword = myArrayList.any { it.contains("keyword") }

答案 1 :(得分:4)

在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

答案 2 :(得分:2)

迭代关键字列表,如果字符串包含您的关键字,则返回true。否则返回false

public boolean containsAKeyword(String str, List<String> keywords){
    for(String k : keywords){
        if(str.contains(k))
            return true;
    }

    return false;
}

答案 3 :(得分:2)

这是解决方案

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

String s1 = "mary is a good girl";
String s2 = "she likes travelling";
// The function
boolean check(String str, List<String> keywords)
  Iterator<String> it = keywords.iterator();
  while(it.hasNext()){
    if(str.contains(it.next()))
       return true;
  }
  return false;
}

答案 4 :(得分:0)

我认为你应该检查String类中的方法:

String s1 = "mary is a good girl";
if(s1.contains("mary")
{
   //Success
}

如果你想提高性能,你可以先拆分句子,然后计算每个单词的所有字符[ASCII值]的总和[我们称之为hashvalue]并为每个单词维护一个单独的桶(可能是数组)其中,现在当你得到一个关键字值时,首先找到它的哈希值并访问该数组,然后使它更有效率,你可以比较它们的长度,然后匹配字符串。

希望有所帮助!

答案 5 :(得分:0)

您可以在hashmap中添加关键字中的所有单词。然后,您可以使用str.contains作为字符串1和字符串2来检查关键字是否可用。

答案 6 :(得分:0)

根据列表的大小,我建议使用String的matches()方法。 String.matches采用一个正则表达式参数,使用较小的列表,你可以创建一个正则表达式并对其进行评估:

String Str = new String("This is a test string");
System.out.println(Str.matches("(.*)test(.*)"));

这应打印出“true”。

或者您可以使用java.util.regex.Pattern

答案 7 :(得分:0)

现在您可以为此使用 Java 8 流:

keywords.stream().anyMatch(keyword -> str.contains(keyword));