如果list1
和list2
至少共享一個項目,如何返回true
?比較Java列表
示例:list1
=(1,2,3)... list2
=(2,3,4)
someFunction(list1, list2); // returns true
如果list1
和list2
至少共享一個項目,如何返回true
?比較Java列表
示例:list1
=(1,2,3)... list2
=(2,3,4)
someFunction(list1, list2); // returns true
查看Collections.disjoint
方法。如果這是真的,則沒有共同的項目。
+1看起來像該方法試圖通過決定哪個集合要迭代以及哪個要用'contains>來檢查,基於幾個因素來優化。 [\ [源\]](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Collections.java#Collections.disjoint%28java。 util.Collection%2Cjava.util.Collection%29) –
遍歷一個使用 「迭代」 和使用列表中包含的其他方法列表來檢查元素。不是嗎?
我想過這樣做,但認爲必須有更好的方法。 –
public boolean someFunction(List<T> l1,List<T> l2)
{
Iterator<T> i = l1.iterator();
while(i.hasNext())
{
if(l2.contains(i.next())
return true;
}
return false;
}
-1爲不需要的評論。 – NINCOMPOOP
像TofuBeer說,看看Collections.disjoint(我給予好評他,如果我有任何的聲譽...):
public void main() {
List<Integer> list1 = Arrays.asList(1,2,3);
List<Integer> list2 = Arrays.asList(2,3,4);
someFunction(list1, list2);
}
private boolean someFunction(List<Integer> list1, List<Integer> list2) {
return ! Collections.disjoint(list1, list2);
}
現在你有一些:-),歡迎來到SO! – TofuBeer
如果空間不是一個問題,爲什麼不使用一個HashMap?
Iterator it1 = list1.iterator(), it2 = list2.iterator();
Map <K, Integer> listmap = new HashMap <K, Integer>();
while (it1.hasNext() && it2.hasNext()) {
K elem1 = it1.next(), elem2 = it2.next();
if ((listmap.get(elem1) != null && listmap.get(elem1) == 2) ||
(listmap.get(elem2) != null && listmap.get(elem2) == 1)) {
return false;
}
else {
listmap.put(elem1, 1);
listmap.put(elem2, 2);
}
}
return true
這樣,就不必循環通過整個第二陣列來檢查的第一個的每個元件中,由於將元素添加到哈希表發生在分期常量時間。
順便說一下,更快的解決方案是使用Apache公用程序中的IntHashMap
(或Android上的SparseArray
)。
[Java比較兩個列表]的可能重複(http://stackoverflow.com/questions/2762093/java-compare-two-lists) – 2013-04-16 05:06:33
你嘗試過什麼嗎? – chris
@chris,下面說了什麼用戶'loki',但它似乎不是最佳的。 –