繁体   English   中英

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

[英]How can I check if a string has a substring from a List?

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

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

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

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

字符串 s1 的关键字中有“mary”,但字符串 s2 没有。 所以,我想定义一个方法:

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

其中containsAKeyword(s1, keywords)会返回 true,但containsAKeyword(s2, keywords)会返回 false。 即使有单个子字符串匹配,我也可以返回 true。

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

我建议遍历整个列表。 幸运的是,您可以使用增强的 for 循环:

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

编辑所知,您必须以某种方式迭代列表。 想一想,不经过它,你怎么知道列表中包含了哪些元素呢?

编辑 2

我可以看到迭代快速运行的唯一方法是执行上述操作。 按照这种设计方式,一旦您找到匹配项,它就会提前中断,而无需进一步搜索。 您可以将 return 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") }

在 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

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

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

    return false;
}

这是解决方案

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

您可以将关键字中的所有单词添加到哈希图中。 然后你可以对字符串 1 和字符串 2 使用 str.contains 来检查关键字是否可用。

根据列表的大小,我建议使用字符串的matches() 方法。 String.matches 接受一个 regex 参数,对于较小的列表,您可以简单地构建一个正则表达式并对其进行评估:

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

这应该打印出“true”。

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

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

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

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

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

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

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

字符串s1的关键字中包含“ mary”,但字符串s2没有。 因此,我想定义一个方法:

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

其中containsAKeyword(s1, keywords)将返回true,但是containsAKeyword(s2, keywords)将返回false。 即使有单个子字符串匹配,我也可以返回true。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM