2008-11-22 24 views
6

Tôi cần bản đồ có hai khóa, ví dụ:Bất kỳ việc triển khai Bản đồ <K1, K2, V>, tức là hai khóa?

Map2<String /*ssn*/, String /*empId*/, Employee> _employees; 

Vì vậy mà tôi có thể

_employees.put(e.ssn(), e.empId(), e) 

Và sau

_employees.get1(someSsn); 
_employees.get2(someImpId); 

Hoặc thậm chí

_employees.remove1(someImpId); 

Tôi không chắc chắn lý do tại sao tôi muốn dừng lại ở hai, tại sao không nhiều hơn, có lẽ vì đó là trường hợp tôi cần ngay bây giờ :-) Nhưng loại cần xử lý số lượng khóa cố định là loại an toàn - thông số loại không thể là vararg :-)

Đánh giá cao bất kỳ gợi ý nào hoặc lời khuyên về lý do tại sao đây không phải là ý tưởng tồi.

+0

Giống như Boost :: MultiIndex (http://www.boost.org/doc/libs/1_37_0/libs/multi_index/doc/index.html), nhưng đối với Java. – dalle

Trả lời

4

Suy nghĩ đầu tiên của tôi là: cách dễ nhất để làm điều này, tôi nghĩ, sẽ là hai bản đồ.

Map< String, Map< String,Employee> > _employees; 

Nhưng từ những gì nó trông giống như, bạn chỉ muốn tìm kiếm một nhân viên bằng SSN hoặc ID. Điều gì ngăn cản bạn sau đó tạo ra hai bản đồ, hoặc tệ nhất là một lớp có chứa hai bản đồ?

Để làm rõ, bạn đang tìm kiếm một khóa phức hợp là nhân viên được xác định duy nhất bằng cách kết hợp SSN và ID của họ, chứ không phải là một trong hai chính nó hoặc bạn đang tìm hai cách khác nhau để tham chiếu một nhân viên ?

+0

Không, nó không phải là một phím tổng hợp, nhưng hai phím khác nhau. Hai bản đồ chính xác là những gì tôi đang làm ngay bây giờ. Đã có trong hai lớp khác nhau.Khi tôi cần nó trong một lớp thứ ba, tôi quyết định viết một lớp Map2, nhưng muốn kiểm tra đầu tiên nếu một đã tồn tại. –

4

Tôi tưởng tượng chính chủ chốt sẽ là empId, vì vậy tôi sẽ xây dựng một Map với điều đó như chìa khóa, ví dụ: empId --->Employee. Tất cả các thuộc tính duy nhất khác (ví dụ: ssn) sẽ được coi là phụ và sẽ sử dụng riêng Map s làm bảng tra cứu cho empId (ví dụ: ssn --->empId).

Triển khai này giúp dễ dàng thêm/xóa nhân viên, vì bạn chỉ cần thay đổi một số Map, tức là empId --->Employee; khác Map s chỉ có thể được xây dựng lại khi cần thiết.

+0

Thú vị. Nó cho phép xóa khỏi bất kỳ khóa nào, ngay cả khi có bất kỳ khóa nào. Nó có thể giúp tôi giải quyết các vấn đề tôi phải đối mặt với cách tiếp cận @krosenvold. –

2

Spiffy Framework dường như cung cấp chính xác những gì bạn đang tìm kiếm. Từ Javadocs:

Một hashmap hai chiều, là một HashMap cho phép bạn tham khảo giá trị qua hai phím chứ không phải là một

Lớp có liên quan là TwoDHashMap. Nó cũng cung cấp ThreeDHashMap.

+1

Bản đồ x-DHashMap có vẻ giống như một Bản đồ với một khóa x-chiều đơn nhưng hợp chất ... bạn không thể sử dụng từng khóa một cách độc lập để truy cập các giá trị. –

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