2009-10-14 97 views
31

我一直在尋找一種類似於Arrays.equals(a1, a2)的方法,但忽略了元素順序。我無法在Google Collections中找到它(類似於Iterables.elementsEqual(),但它確實佔用了排序),JUnit(assertEquals()顯然只是在集合上調用equals(),這取決於Collection實現,而這不是我想要的) 如果這樣的方法會花費Iterable秒,那麼最好,但我也很好,只要簡單地取出Collection s 這樣的方法當然會考慮集合中的任何重複元素(因此它不能簡單地測試對於containsAll())。有沒有辦法檢查兩個集合是否包含相同的元素,與訂單無關?

請注意,我不問如何實現這樣的事情,我只是想知道是否有任何標準集合庫有它。

回答

39

阿帕奇公地收藏有CollectionUtils#isEqualCollection

返回true,如果給定的集合包含正好完全相同的基數相同的元素。也就是說,如果a中的e的基數等於b中的e的基數,那麼對於a或b中的每個元素e而言。

這是,我想,你到底是什麼。

+21

如果你不想使用Apache(或者你不能),你總是可以這樣做: collection1.containsAll(collection2)&& collection2.containsAll(collection1) – 2013-07-01 00:27:05

+25

@ChrisGonzales,注意這個解決方案 - 它會返回true以下兩個集合:collection1 = [1,blah,1,4], collection2 = [1,blah,blah,4]。這兩個集合的確不一樣。 – 2014-07-24 15:59:15

2

如果你想忽略順序,那麼測試如何設置相等?

new HashSet(c1).equals(new HashSet(c2)) 
+2

這不起作用,因爲它會丟棄重複的元素。 另外,我不得不創建兩個新的HashSet。我寧願避免爲此創建新對象。 – Jorn 2009-10-14 09:44:59

+0

如果你不在乎重複,例如根據該表達式,c1 = Arrays.asList(1,1,2),c2 = Arrays.asList(1,2,2)將是相等的。 – finnw 2009-10-14 09:46:25

+2

是的,但我確實在意重複項(現在的問題也如此陳述) – Jorn 2009-10-14 09:49:47

27

這三年方法調用和使用谷歌集合Guava,但可能是那樣簡單,因爲它得到:

HashMultiset.create(c1).equals(HashMultiset.create(c2)); 

創建臨時Multiset S可看上去很浪費,但比較集合有效地你需要以某種方式索引它們。

+0

這看起來似乎是迄今爲止我見過的最有效(最簡單)的解決方案。 – Jorn 2009-10-14 09:50:32

+0

@Jorn:我以爲你說過你不是在問怎麼實現這個... – 2009-10-14 10:03:54

+0

我不是說這是我要求的解決方案,但我還沒有看到一個答案,它提供了一個方法調用給我做這個。 – Jorn 2009-10-14 10:13:17

相關問題