2014-01-29 39 views
0

我對java很陌生,我有兩個List<String>。當我這樣做時:如何比較兩個列表字符串?

list1.equals(list2) 

給我false。儘管列表相同。

這是檢查平等的正確方法嗎?

+3

我們必須知道您的'equals'的定義 – Kent

+2

包含代碼可以讓我們重現您的問題。否則,我們只能猜測什麼是錯的,這意味着很多猜測。 – Pshemo

+0

請發佈示例輸入和輸出。 – skiwi

回答

1

你可以使用isEqualList從Apache的ListUtils

isEqualList

public static boolean isEqualList(java.util.Collection list1, 
            java.util.Collection list2) 

測試的價值平等的兩個列表按在 List.equals(Java中的平等契約。 lang.Object)。

此方法對於在不能擴展 AbstractList時執行列表很有用。該方法使用Collection實例來啓用其他 集合類型以使用List實現算法。

相關文本(略意譯,因爲這是一個靜態方法) 是:

比較兩個列表對象是否相等。如果且僅當兩個列表具有相同的大小並且兩個列表中的所有對應的 元素相等,則返回true。 (兩個元素e1和e2等於 if(e1 == null?e2 == null:e1.equals(e2))。)換句話說,兩個列表 被定義爲相等,如果它們包含相同的元素相同 的順序。此定義確保equals方法在List接口的不同實現之間正常工作 。注意:如果在 等於比較期間修改列表,則此方法的 行爲未定義。

+4

我不明白在這個特定情況下vs vs List#equals – assylias

+0

與@assylias一致,我沒有看到標準實現有什麼問題。 – skiwi

1

這是正確的方法。你的名單與你所說的不一樣。嘗試打印它們以進行視覺檢查。

+1

所以基本上你是說這應該工作,如果不是這意味着列表有問題,OP應該打印它們以查看問題?看起來[更像是對我的評論,而不是回答](http://meta.stackexchange.com/questions/118992/are-works-for-me-answers-valid)。 – Pshemo

0

對於兩個列表相同,它們需要具有相同的順序。我只能假設你想在考慮平等時忽略兩個列表的排序。

對於忽略順序的比較,可以比較兩個Map<String, Integer>實例(其中Integer是每個字符串的計數)。

如:

public <T> boolean isEqualIgnoreOrder(List<T> l1, List<T> l2) { 
    if (l1.size() != l2.size()) { 
     return false; 
    } 
    Map<T, Integer> m1 = createMap(l1); 
    Map<T, Integer> m2 = createMap(l2); 
    return m1.equals(m2); 
} 

protected <T> Map<T, Integer> createMap(List<T> list) { 
    Map<T, Integer> map = new HashMap<T, Integer>(); 
    for (T item : list) { 
     Integer prevCount = map.get(item); 
     map.put(prevCount == null ? 1 : prevCount + 1); 
    } 
    return map; 
} 

這種類型的集合稱爲一個袋子。更多討論here