2013-04-16 158 views
1

如果list1list2至少共享一個項目,如何返回true比較Java列表

示例:list1 =(1,2,3)... list2 =(2,3,4)

someFunction(list1, list2); // returns true

+3

[Java比較兩個列表]的可能重複(http://stackoverflow.com/questions/2762093/java-compare-two-lists) – 2013-04-16 05:06:33

+0

你嘗試過什麼嗎? – chris

+0

@chris,下面說了什麼用戶'loki',但它似乎不是最佳的。 –

回答

8

查看Collections.disjoint方法。如果這是真的,則沒有共同的項目。

+0

+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) –

0

遍歷一個使用 「迭代」 和使用列表中包含的其他方法列表來檢查元素。不是嗎?

+0

我想過這樣做,但認爲必須有更好的方法。 –

0
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; 
} 
+2

-1爲不需要的評論。 – NINCOMPOOP

1

像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); 
} 
+0

現在你有一些:-),歡迎來到SO! – TofuBeer

0

如果空間不是一個問題,爲什麼不使用一個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)。