2015-08-21 111 views
-3

我希望能夠比較兩個或更多像列表'<'整數'>'l1,列表l2,列表l3 ...,但如何比較它們?如何比較兩個或更多List(Integer)是否相等?

在我看來,首先Collections.sort(列表),然後l1.euqals(l2),等等......但是它似乎不是有效的方式,它的成本約O(n^2),和沒有兩個列表,它可能是三個或四個或更多...

而Anthoer方式使用額外的足夠的最大數組A一個初始化零,第一個A [l1.get(i)]填充一個數字不是-Zero,則A [l2.get(i)]填充零,最後,如果Array A仍然滿零,則兩個列表相等。它的成本O(N),但麻煩的事情不僅是兩個清單...

是否有任何快速和有效的方式,只有成本較少的時間? 我希望我能表達清楚。希望回答!

+0

在Java中設置#equals()不考慮元素的順序,因此不需要排序。 –

+0

@JordiCastilla這個問題是關於n> 2套,這是不同於你發佈的鏈接中的問題(比較**兩套**)。 – laune

+0

@JordiCastilla,@ laune yeah和\t我需要比較列表而不是集合。 – xiaocainiao

回答

0

比方說,你有一個

List<Collection<X>> listOfColls 

,需要知道他們是否都是平等的。列表或設置相等的先決條件是它們具有相同數量的元素。所以

public static <X> boolean allequal(List<Collection<X>> listOfColls){ 
    if(listOfColls.size() <= 1) return true; 
    int nel = listOfColls.get(0).size(); 
    for(int i = 1; i < listOfColls.size(); ++i){ 
     if(listOfColls.get(i).size() != nel) return false; 
    } 
    for(int i = 1; i < listOfColls.size(); ++i){ 
     if(! listOfColls.get(i).equals(listOfColls.get(0))) return false; 
    } 
    return true; 
} 

在一組列表或集合不是全部相等的情況下,您至少有一個基數不同的機會很高。這就是爲什麼在調用等於n-1次之前,對該屬性進行快速檢查平均而言有利。

但請注意,集合的實際類別影響equals的工作方式。對於Set,它被設置爲比較訂單不適用的地方。對於列表,訂單是相關的,並且您可能有重複(相等)的元素。您可能需要對列表進行排序或將其轉換爲集...

至於等於本身,依靠List或Set實現來做最好的事情。不應該重寫JDK類的方法 - 這些程序員很難超越。

+0

我需要比較列表而不是集合。 – xiaocainiao

+0

確定 - 實際上這應該對收藏列表起作用 - 對於列表和集合 – laune

+0

您也寫過「比較兩個或更多集合」。下定決心! - 點是你是否需要「設置語義」而不是「列表語義」。 – laune

相關問題