2009-10-14 26 views
31

Tôi đã tìm kiếm một phương thức hoạt động như Arrays.equals(a1, a2), nhưng bỏ qua thứ tự phần tử. Tôi không thể tìm thấy nó trong Google Collections (giống như Iterables.elementsEqual(), nhưng điều đó không giải thích được thứ tự) và JUnit (assertEquals() rõ ràng là chỉ gọi equals() trên Bộ sưu tập, phụ thuộc vào việc triển khai Bộ sưu tập và đó không phải là điều tôi muốn Nó sẽ là tốt nhất nếu như một phương pháp sẽ mất Iterable s, nhưng tôi cũng tốt với chỉ đơn giản là tham gia Collection s Như vậy một phương pháp tất nhiên sẽ đưa vào tài khoản bất kỳ yếu tố trùng lặp trong bộ sưu tập (vì vậy nó không thể chỉ đơn giản là thử nghiệm cho containsAll()).Có cách nào để kiểm tra xem hai Bộ sưu tập có chứa cùng các yếu tố, không phụ thuộc vào thứ tự không?

Lưu ý rằng tôi không hỏi làm thế nào để thực hiện một điều như vậy, tôi đã chỉ tự hỏi nếu có bất kỳ thư viện Bộ sưu tập tiêu chuẩn có nó.

Trả lời

39

Apache commons-bộ sưu tập có CollectionUtils#isEqualCollection:

Returns true nếu bộ sưu tập được chứa chính xác các yếu tố tương tự với chính xác cardinality cùng.

Tức là, nếu số lượng của e trong a bằng với số lượng của e trong b, đối với mỗi phần tử e trong a hoặc b.

Tôi nghĩ chính xác những gì bạn đang theo dõi.

+21

Trong trường hợp bạn không muốn sử dụng Apache (hoặc bạn không thể), bạn luôn có thể làm: collection1.containsAll (collection2) && collection2.containsAll (collection1) –

+25

@ChrisGonzales, hãy cẩn thận về giải pháp đó - nó sẽ trả về true cho hai bộ sưu tập sau đây: collection1 = [1, blah, 1, 4], collection2 = [1, blah, blah, 4]. Nơi hai bộ sưu tập đó thực sự không giống nhau. –

2

Nếu bạn muốn bỏ qua thứ tự, thì làm thế nào về các bộ thử nghiệm cho sự bình đẳng?

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

Điều đó không hiệu quả, vì nó sẽ vứt bỏ các phần tử trùng lặp. Ngoài ra, tôi phải tạo hai HashSets mới. Tôi muốn tránh tạo các đối tượng mới cho việc này. – Jorn

+0

Điều này là tốt nếu bạn không quan tâm đến các bản sao, ví dụ: c1 = Arrays.asList (1, 1, 2), c2 = Arrays.asList (1, 2, 2) sẽ bằng nhau theo biểu thức này. – finnw

+2

Đúng, nhưng tôi quan tâm đến các bản sao (như câu hỏi hiện nay là tốt) – Jorn

27

Đây là ba cuộc gọi phương pháp và sử dụng Google CollectionsGuava, nhưng là có thể đơn giản như nó được:

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

Tạo tạm Multiset s có thể xuất hiện lãng phí, nhưng để so sánh bộ sưu tập hiệu quả bạn cần để lập chỉ mục chúng bằng cách nào đó.

+0

Điều này dường như là giải pháp hiệu quả nhất (và đơn giản) mà tôi đã thấy cho đến nay. – Jorn

+0

@Jorn: Tôi nghĩ bạn đã nói bạn không hỏi cách thực hiện điều này ... –

+0

Tôi không nói đó là giải pháp tôi đã yêu cầu, nhưng tôi chưa thấy câu trả lời cung cấp cho tôi một lời gọi phương thức làm cái này. – Jorn

Các vấn đề liên quan