Tôi không chắc chắn nhu cầu của bạn là gì (hoặc trường hợp sử dụng cụ thể), nhưng tôi sẽ cố gắng đoán. Các câu trả lời khác gợi ý sử dụng liên kết * Multimap hoặc không thể thay đổi, nhưng để có được kết quả mong muốn (hiển thị trong câu hỏi) với Multimap
, bạn sẽ phải tạo một số Bản đồ ưa thích (tôi sẽ thảo luận sau) hoặc ví dụ: và giá trị thứ ba cho mỗi khóa (chúng sẽ được đặt theo thứ tự chèn, nếu bạn sử dụng một trong số các triển khai Multimap
được đề xuất). Tốt nhất nó sẽ là một trong những ListMultimaps
như bạn có thể duyệt qua multimap.keySet()
để có được danh sách với giá trị có sẵn của chỉ số:
final ListMultimap<String,String> multimap = LinkedListMultimap.create();
// put values from question here
final List<Object> firstValues = Lists.newArrayList();
for (final String key: multimap.keySet()) {
firstValues.add(multimap.get(key).get(0));
}
System.out.println(firstValues);
// prints [value1, value11, value111]
// similar for multimap.get(key).get(1) and so on
nhưng nhược điểm là bạn sẽ phải tạo ra ba Lists cho bạn ví dụ những gì làm cho giải pháp này khá không linh hoạt.Vì vậy, có lẽ nó sẽ được tốt hơn để đặt {đầu tiên, thứ hai, thứ ba} Giá trị thu vào Map>, những gì mang lại cho tôi vào vấn đề:
Có lẽ bạn nên sử dụng Table để thay thế?
Bảng được thiết kế như Một bộ sưu tập mà liên kết một cặp có thứ tự các phím, được gọi là một chìa khóa hàng và một phím cột, với một giá trị duy nhất và, có chuyện gì quan trọng hơn ở đây, có hàng và chế độ xem cột. Tôi sẽ sử dụng ArrayTable
đây:
final ArrayTable<String, Integer, Object> table = ArrayTable.create(
ImmutableList.of("1", "2", "3"), ImmutableList.of(0, 1, 2));
table.put("1", 0, "value1");
table.put("1", 1, "value2");
table.put("1", 2, "value3");
table.put("2", 0, "value11");
table.put("2", 1, "value22");
table.put("2", 2, "value33");
table.put("3", 0, "value111");
table.put("3", 1, "value222");
table.put("3", 2, "value333");
for (final Integer columnKey : table.columnKeyList()) {
System.out.println(table.column(columnKey).values());
}
// prints:
// [value1, value11, value111]
// [value2, value22, value222]
// [value3, value33, value333]
Tôi cố tình sử dụng String cho phím hàng là [1, 2, 3, ...] Số nguyên trong thực tế (như bạn đã làm trong câu hỏi) và số nguyên cho các phím cột bắt đầu bằng 0 ([0, 1, 2, ...]) để hiển thị sự giống nhau với ví dụ trước bằng cách sử dụng bộ sưu tập của Danh sách get(int)
trên các giá trị nhiều giá trị '.
Hy vọng điều này sẽ hữu ích, chủ yếu trong việc xác định những gì bạn muốn;)
P.S. Tôi sử dụng ArrayTable
tại đây, bởi vì nó có cách tạo ra các giá trị hàng/khóa cố định (vũ trụ) hơn ImmutableTable
, nhưng nếu không yêu cầu, bạn nên sử dụng nó thay vì một thay đổi - ImmutableTable
(và bất kỳ triển khai Bảng nào khác) Không có phương pháp columnKeyList()
, nhưng chỉ có columnKeySet()
thực hiện tương tự, nhưng chậm hơn đối với ArrayTable
. Và tất nhiên ImmutableTable.Builder
hoặc ImmutableTable.copyOf(Table)
nên được sử dụng.
Bộ sưu tập 'băm *' không giữ nguyên thứ tự chèn. – SLaks
trông giống như tôi cần phải sử dụng Bảng không phải là một MultiMap – KJW