簡體   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