2013-06-12 36 views
5

Giả sử tôi có một lớp POJO Class1 đơn giản và nó có 2 trường kiểu int.Sử dụng nhiều lựa chọn thay thế của hashCode() và equals() cho các bộ

Tôi đã triển khai các phương thức hashCode() và equals() của nó để xử lý chính xác 2 trường đó, để đặt các phiên bản của lớp vào tập hợp.

Cho đến nay rất tốt.

Bây giờ, tôi muốn có một tập hợp khác, xem xét các trường hợp của Class1 bằng nhau nếu trường đầu tiên bằng nhau, làm cho tình trạng bình đẳng yếu hơn. Tôi thậm chí có thể muốn có một bộ khác chỉ xem trường thứ hai là trường kiểm tra bình đẳng.

Có thể không? Nếu vậy, làm thế nào?

+1

Sử dụng Trình so sánh cùng với TreeMap. Các tùy chọn khác là để mở rộng HashMap vì vậy nó sử dụng một máy phát điện Hash thay vì hashCode() – BevynQ

+0

Có thể mở rộng HashSet bằng cách nào đó? –

Trả lời

5

Bạn thể có hiệu lực thi hành mà bằng cách sử dụng một TreeSet khi cung cấp một tùy chỉnh Comparator mà chỉ kiểm tra các lĩnh vực bạn quan tâm.

Lưu ý, tuy nhiên, nói đúng như một TreeSet không còn là một " sửa" Set vì nó có hiệu quả bỏ qua các phương pháp equal() đối tượng của bạn:

Lưu ý rằng thứ tự được duy trì bởi một bộ (đã hoặc chưa một so sánh rõ ràng được cung cấp) phải c phù hợp với bằng nếu thực hiện đúng giao diện Set. (Xem Comparable hoặc Comparator cho một định nghĩa chính xác của phù hợp với bằng.) Đây là như vậy bởi vì giao diện Set được định nghĩa về hoạt động equals, nhưng một trường hợp TreeSet thực hiện mọi sự so sánh yếu tố sử dụng phương pháp compareTo (hoặc compare) của nó, do đó, hai yếu tố được coi là bằng nhau theo phương pháp này, từ quan điểm của tập hợp, bằng nhau. Hành vi của một tập hợp được xác định rõ ngay cả khi thứ tự của nó là không phù hợp với bằng; nó chỉ không tuân theo giao ước chung của giao diện Set.

3

Thư viện Java chuẩn không hỗ trợ điều này.

Và (đáng ngạc nhiên) có vẻ như không phải là lớp học Map hoặc Set trong thư viện Bộ sưu tập Apache hoặc Thư viện ổi hỗ trợ điều này.

Có thể có các thư viện khác để hỗ trợ điều này nếu bạn nhìn đủ cứng.

Ngoài ra, bạn có thể tự viết ... bắt đầu với mã số tiêu chuẩn HashMap.


Một lựa chọn giá rẻ-and-vui vẻ là để tạo ra một lớp wrapper nhẹ cho loại nguyên tố của bạn mà các đại biểu nhất phương thức cho lớp bọc và cung cấp một khác nhau cặp equals/hashcode với bản gốc. Có một hình phạt thời gian chạy nhỏ trong việc này ... nhưng nó là giá trị xem xét.

Đề xuất của Joachim cũng tốt, trừ khi bộ của bạn có khả năng đặc biệt lớn. (TreeSet có tra cứu O(logN) so với O(1) cho bảng băm được triển khai đúng cách.)

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