2010-06-22 45 views
9

Lớp MultiValueMap (bộ sưu tập của Apache commons) giúp dễ dàng làm việc với Bản đồ có giá trị là Bộ sưu tập. Tôi đang tìm một lớp giúp dễ dàng làm việc với Bản đồ có khóa là các đối tượng và giá trị là Bản đồ.Bản đồ cấu trúc dữ liệu Bản đồ

Tôi đang sử dụng Java 1.4, vì vậy không thể sử dụng Google Collections hoặc Generics.

+0

Bạn cần bản đồ nào bên cạnh? Bạn đang lập bản đồ từ bản đồ đến đối tượng, đối tượng đến bản đồ, hoặc ánh xạ tới bản đồ? – MikeD

+0

Bạn có thể tạo Map Map> không? Hoặc bạn muốn có thể làm một cái gì đó như map.put (key1, key2, value)? – Dave

+0

Không phải là nó quá liên quan, tôi cho rằng, nhưng tôi tò mò: Công ty/ngành nào (cụ thể như bạn cảm thấy thoải mái khi nói với chúng tôi) vẫn yêu cầu Java 1.4? Thậm chí Java 5 đã được hoàn thành. Java 1.4 đã được EOLd trong gần 2 năm rồi. –

Trả lời

7

Bản đồ bản đồ thực sự là cấu trúc kiểu cây không có nút gốc đơn (cũng như bản đồ bản đồ của bản đồ ...).

Bạn có thể xem Composite pattern được sử dụng rộng rãi để thực hiện cấu trúc cây (nếu các thành phần của chúng có cùng loại không phải là trường hợp tôi cảm nhận).

Một giải pháp khác là triển khai một mô hình miền đơn giản. Nó sẽ được rõ ràng hơn nhiều để đọc và dễ dàng để duy trì cái gì đó như:

school.getPupil ("John Doe").getMark ("Math") 

hơn

school.get ("John Doe").get ("Math") 
4

Bộ sưu tập Bản đồ thường xuyên làm việc cho này:

Map<Object,Map<Object,Object>> mapOfMaps = new LinkedHashMap<Object,Map<Object,Object>>(); 
    Object newObject = new String("object as string"); 
    mapOfMaps.put(newObject, new LinkedHashMap<Object,Object>()); 
    Map<Object,Object> objectMap = mapOfMaps.get(newObject); 

Trong thực tế, nếu bạn 'không lo lắng về an toàn loại, bạn có thể đặt bất cứ điều gì bạn muốn vào phần giá trị:

Map<Object,Object> mapOfWhatever = new LinkedHashMap<Object,Object>(); 
    Object newObject = new String("object as string"); 
    mapOfWhatever.put(newObject, new LinkedHashMap<Object,Object>()); 
    Map<Object,Object> objectMap = (Map<Object, Object>) mapOfWhatever.get(newObject); 
+0

Thông thường người ta không muốn có để quan tâm đến việc một khóa đã cho (đầu tiên) đã có trong 'mapOfMaps', ví dụ khi thực hiện 'mapOfMaps.get (" firstKey "). put (" secondKey ", value)'. Ví dụ, bản đồ của Python có một phương pháp ['setdefault'] (http://docs.python.org/2/library/stdtypes.html#dict.setdefault) cho mục đích này. –

1

Nếu bạn có map:{string,map:{string,thing}} (cố ý không sử dụng cú pháp Java để tránh toàn bộ doanh nghiệp Java1.4/Java5) thì bạn cũng nên cân nhắc xem liệu bạn có nên mô hình hóa đó là map:{tuple:{string,string},thing} hay không. Nếu tra cứu đa cấp chiếm ưu thế, thì đó là một thay đổi tốt để thực hiện (miễn là bạn triển khai tuple tốt equals() chính xác và hashCode() một cách thông minh) nhưng nếu bạn đang thực hiện nhiều thao tác chèn và xóa thì sẽ kém hơn.

Thông minh trong hashCode có thể có nghĩa là chỉ cần đưa ra một cách hợp lý để trộn các bit từ hashCodes của nội dung với nhau. Nếu các giá trị thành viên được mong đợi từ các bộ phân tách (ví dụ, tên và nghề nghiệp) thì bạn chỉ có thể XOR chúng lại với nhau - không hoàn hảo, nhưng rẻ và nhanh - nhưng nếu bạn ít kiểm soát/chắc chắn hơn thì bạn cần phải làm điều gì đó khác tốt (ví dụ, xoay các bit của một trong các giá trị trước XOR).

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