Có cách nào để xử lý Bộ sưu tập lồng nhau thanh lịch hơn không?


8

Câu hỏi của tôi là một câu hỏi thiết kế. Trong chương trình của tôi, tôi đã nhận được một cấu trúc dữ liệu trông giống như thế này:

private ConcurrentHashMap<A, ConcurrentHashMap<B, ConcurrentHashMap<Integer, C>>> services  = new ConcurrentHashMap<A, ConcurrentHashMap<B, ConcurrentHashMap<Integer, C>>>();

Có cách nào để xử lý một cấu trúc dữ liệu như vậy thanh lịch hơn? Cảm ơn!

chỉnh sửa : A, B và C là các lớp kinh doanh. Một thể hiện "có thể có" (như liên kết) nhiều Bs và B "có thể có" nhiều ánh xạ Integer-C.


Những loại là A, BC? Sẽ dễ dàng hơn để trả lời nếu tôi có thể hiểu ý nghĩa của việc lồng ba cấp của bạn có bản đồ ở đó.
dasblinkenlight

1
Không biết gì về tên miền, tôi không nghĩ có một giải pháp chung. Tùy thuộc vào cách sử dụng bản đồ, bạn có thể xem xét thay thế một hoặc nhiều bản đồ bằng các lớp xuất một bộ thuộc tính cụ thể.
Ernest Friedman-Hill

4
Xem xét sử dụng các đối tượng đóng gói hành vi, thay vì các cơ sở dữ liệu câm. Mỗi bản đồ này có lẽ nên được bọc vào một đối tượng cụ thể.

Ở một bên, bạn có thực sự cần sử dụng ConcurrentHashMaps ở mọi cấp độ lồng nhau không?
Russell

@ ErnestFriedman-Hill: Tôi đã nghĩ rằng nó có thể là như vậy - rằng không có "giải pháp chung", chỉ có một giải pháp liên quan đến kinh doanh.

Câu trả lời:


16

Tạo một lớp Triplevới các lĩnh vực cho A, B, Integer, ghi đè hashCode()equals(), và sử dụng Map<Triple,C>thay vìMap<A,Map<B,Map<Integer,C>>>

Trong phương pháp này - bạn đặt tất cả các yếu tố trong một bản đồ, với phạm vi khóa lớn hơn có thể.


Downvoter sẽ giải thích? Tôi giả sử ở đây OP thực sự đang cố gắng lập bản đồ: (A,B,Integer)-> C, và do đó việc Mapsử dụng lồng nhau . Bản chỉnh sửa cũng hỗ trợ cho sự đánh lừa của tôi.
amit

2
Đúng, đây là những gì tôi đang cố gắng ánh xạ: (A, B, Integer) đến C.

Tôi cũng sẽ thêm, đặt tên cho lớp Ba một cái gì đó có ý nghĩa trong lĩnh vực kinh doanh của bạn. Nó phải có ý nghĩa gì đó :-)
Martijn Verburg

Do hợp đồng của equals, điều này sẽ chỉ hoạt động nếu các khóa tạo thành một mối quan hệ tương đương. Gần đây tôi đã gặp một tình huống như thế này khi họ không: thành phần thứ ba của khóa có thể là giá trị mặc định chấp nhận bất kỳ trường hợp nào hoặc một giá trị cụ thể nào đó, với tất cả các giá trị cụ thể khác nhau. Do đó, bất kỳ giá trị cụ thể nào cũng sẽ phải được coi là bằng với giá trị mặc định và theo tính siêu việt, tất cả chúng sẽ phải bằng nhau, điều mà chúng không có.
G. Bach

6

[Tôi đến từ nền C #, nhưng câu trả lời nên được áp dụng]

[Nó không quan trọng lắm nhưng tôi giả sử mục cuối cùng là ConcảnHashMap <C, Integer> ]

Bạn có một hàm f loại A -> (B -> (C -> int)) Nếu đó thực sự là những gì bạn cần, tôi không có câu trả lời sẵn sàng. Nhưng có lẽ, có một hàm f loại (A x B x C) -> int sẽ đủ cho mục đích của bạn.

Sự khác biệt giữa hai trường hợp là, trường hợp đầu tiên là lười hơn, nhiều chức năng hơn, thanh lịch hơn và có thể có chức năng "áp dụng một phần" xung quanh. Ví dụ, bạn có một một (loại A) phần tử, bạn áp dụng một đến f và có một hàm g loại (B -> (C -> int)) để vượt qua xung quanh, gửi đến các phương pháp, bất cứ điều gì. Tuy nhiên, nó hơi cồng kềnh và thêm một chút mã để khởi tạo đúng chức năng.

Thứ hai là háo hức và kém thanh lịch, nhưng có thể dễ viết mã và dễ hiểu hơn. Tất cả những gì bạn cần làm là có một lớp chung Triple <A, B, C> , ghi đè Equals () và GetHashCode () để nó có ngữ nghĩa giá trị, (hai trường hợp sẽ được coi là bằng nhau nếu chúng có các phần tử bằng nhau) và khai báo ConcảnHashMap là từ Triple đến Integer . Chi phí rõ ràng nhất phải trả là bạn cần có sẵn các yếu tố A , B , C để tạo một thể hiện của Triple và thực hiện tra cứu.

Chỉnh sửa: Nếu mục cuối cùng thực sự là ConcảnHashMap <C, Integer> , thì lớp chung của bạn sẽ có các trường A , BInteger và ánh xạ sẽ từ Triple <A, B, Integer> đến C


Có thể gọi nó Triplethay vì MyClassđể làm rõ; Ngoài ra còn có các triển khai n-tuple trên web, nếu bạn thực sự lười biếng.

Trên thực tế, bản đồ cuối cùng là ConcảnHashMap <Integer, C>, không phải ConcảnHashMap <C, Integer>, nhưng đó chỉ là một chi tiết nhỏ, vì từ câu trả lời của bạn tôi thấy bạn đã hiểu đúng.
ovdsrn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.