我公司目前擁有其內容如何檢查是否一個數組包含特定術語 - Android電子
if(Arrays.asList(results).contains("Word"));
聲明,我想至少幾個方面增加了。載參數但是我的印象是,這是不好的編程習慣在一條線上有大量的術語..
我的問題是,是否有一個更合適的方法來存儲我想要在.contains參數中的所有值?
感謝
我公司目前擁有其內容如何檢查是否一個數組包含特定術語 - Android電子
if(Arrays.asList(results).contains("Word"));
聲明,我想至少幾個方面增加了。載參數但是我的印象是,這是不好的編程習慣在一條線上有大量的術語..
我的問題是,是否有一個更合適的方法來存儲我想要在.contains參數中的所有值?
感謝
可以使用兩個列表的交集:
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())
現在我正在嘗試這種方法,但是我得到了「無法調用原始類型布爾型的大小()」錯誤 – TomSelleck 2012-03-24 18:28:18
哎呀。你是對的。 'retainAll'方法改變了原始的集合並返回一個布爾值。我編輯了答案來解決這個問題。 – Diego 2012-03-24 21:47:56
實際上沒有必要創建一個臨時Set對象。 – neevek 2012-03-25 02:21:17
你爲什麼不只是存儲您results
在HashSet
?使用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;
}
}
}
您可以利用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);
}
請注意,由於「狗」位於results
和wordsWeAreLookingFor
中,因此此特定代碼示例在foundWordInResults
中將包含true。
要回答更大的問題,請告訴我們。爲什麼你有一個單詞列表,爲什麼你要檢查4-5個不同的單詞? – Blundell 2012-03-24 17:38:38
你是什麼意思對參數更多的條款?就像,你會在尋找一個完整的句子或什麼? – jpm 2012-03-24 17:40:15
@jpom他的意思是如果(Arrays.asList(results).contains(「Word」)|| Arrays.asList(results).contains(「Word2」)|| Arrays.asList(results).contains(「Word3」 ))' – Blundell 2012-03-24 17:44:05