2012-03-24 45 views
5

我公司目前擁有其內容如何檢查是否一個數組包含特定術語 - Android電子

if(Arrays.asList(results).contains("Word")); 

聲明,我想至少幾個方面增加了。載參數但是我的印象是,這是不好的編程習慣在一條線上有大量的術語..

我的問題是,是否有一個更合適的方法來存儲我想要在.contains參數中的所有值?

感謝

+0

要回答更大的問題,請告訴我們。爲什麼你有一個單詞列表,爲什麼你要檢查4-5個不同的單詞? – Blundell 2012-03-24 17:38:38

+0

你是什麼意思對參數更多的條款?就像,你會在尋找一個完整的句子或什麼? – jpm 2012-03-24 17:40:15

+1

@jpom他的意思是如果(Arrays.asList(results).contains(「Word」)|| Arrays.asList(results).contains(「Word2」)|| Arrays.asList(results).contains(「Word3」 ))' – Blundell 2012-03-24 17:44:05

回答

7

可以使用兩個列表的交集:

String[] terms = {"Word", "Foo", "Bar"}; 
List<String> resultList = Arrays.asList(results); 
resultList.retainAll(Arrays.asList(terms)) 
if(resultList.size() > 0) 
{ 
     /// Do something 
} 

爲了雖然提高性能,這是更好地使用兩種HashSet S上的交集:

String[] terms = {"Word", "Foo", "Bar"}; 
Set<String> termSet = new HashSet<String>(Arrays.asList(terms)); 
Set<String> resultsSet = new HashSet<String>(Arrays.asList(results)); 
resultsSet.retainAll(termSet); 
if(resultsSet.size() > 0) 
{ 
     /// Do something 
} 

作爲一個附註,上面的代碼檢查是否任何的條款出現在results。要檢查ALL的條款出現在結果中,您只需確保交集大小相同的術語列表:

resultsSet.retainAll(termSet); 
if(resultSet.size() == termSet.size()) 
+0

現在我正在嘗試這種方法,但是我得到了「無法調用原始類型布爾型的大小()」錯誤 – TomSelleck 2012-03-24 18:28:18

+0

哎呀。你是對的。 'retainAll'方法改變了原始的集合並返回一個布爾值。我編輯了答案來解決這個問題。 – Diego 2012-03-24 21:47:56

+0

實際上沒有必要創建一個臨時Set對象。 – neevek 2012-03-25 02:21:17

0

你爲什麼不只是存儲您resultsHashSet?使用HashSet,您可以從密鑰的哈希中受益,並且它會使您的斷言更快。

Arrays.asList(results).contains("Word")每次創建一個臨時的List對象只是做線性搜索,它不是有效的使用內存,它很慢。

還有HashSet.containsAll(Collection collection)方法可以用來做你想做的事,但是如果你想創建一個臨時的參數列表來做一個斷言,那麼它就不是有效地使用內存。

我建議如下:

HashSet hashSet = .... 
public assertSomething(String[] params) { 
    for(String s : params) { 
     if(hashSet.contains(s)) { 
      // do something 
      break; 
     } 
    } 
} 
1

您可以利用Android的java.util.Collections 類來幫助你們。特別是,disjoint將是有用的:

返回指定的集合是否沒有共同的元素。

這裏有一個代碼示例,應該讓你開始。

在您的活動或任何你正在檢查,看看你的結果中包含你正在尋找一個字:

String[] results = {"dog", "cat"}; 
    String[] wordsWeAreLookingFor = {"foo", "dog"}; 
    boolean foundWordInResults = this.checkIfArrayContainsAnyStringsInAnotherArray(results, wordsWeAreLookingFor); 
    Log.d("MyActivity", "foundWordInResults:" + foundWordInResults); 

而且在同一類,或者是一個工具類:

private boolean checkIfArrayContainsAnyStringsInAnotherArray(String[] results, String[] wordsWeAreLookingFor) { 
    List<String> resultsList = Arrays.asList(results); 
    List<String> wordsWeAreLookingForList = Arrays.asList(wordsWeAreLookingFor); 
    return !Collections.disjoint(resultsList, wordsWeAreLookingForList); 
} 

請注意,由於「狗」位於resultswordsWeAreLookingFor中,因此此特定代碼示例在foundWordInResults中將包含true。

相關問題