对于嵌套的ArrayListMultimap
,我有以下代码:
Multimap<String, Multimap<Integer, String>> doubleMultiMap = ArrayListMultimap.create();
Multimap<Integer, String> doc = ArrayListMultimap.create();
doc.put(1, "ABC");
doc.put(2, "BCD");
doc.put(1, "XYZ");
doubleMultiMap.put("D123", doc);
doc = ArrayListMultimap.create();
doc.put(1, "John");
doc.put(2, "Jane");
doc.put(2, "George");
doubleMultiMap.put("J123", doc);
System.out.println(doubleMultiMap.get("D123"));
对于
doubleMultiMap.get("D123")
,我得到的结果为[{1=[ABC, XYZ], 2=[BCD]}]
但是如何获取键
D123, 1
的值。我尝试使用(doubleMultiMap.get("D123")).get(1)
,但不受支持。更新:
我想要达到的目标如下。如果嵌套
Multimap
不理想,我可以使用什么替代方法?最佳答案
如果不需要行或列访问之类的特定于Table
的方法(并且似乎不需要,因为您要访问D123, 1
),则可以使用Multimap
的复合键。创建简单的类,使用正确的hashCode
和equals
存储字符串和整数,并正常使用multimap。假设您的复合键类名称为Key
(您应该考虑一个更好的名称),您应该可以执行以下操作:
//given
ListMultimap<Key, String> multimap = ArrayListMultimap.create(); // note ListMultimap
multimap.put(new Key("D123", 1), "ABC");
multimap.put(new Key("D123", 2), "BCD");
multimap.put(new Key("D123", 1), "XYZ");
multimap.put(new Key("J123", 1), "John");
multimap.put(new Key("J123", 2), "Jane");
multimap.put(new Key("J123", 2), "George");
//when
List<String> values = multimap.get(new Key("D123", 1));
//then
assertThat(values).containsExactly("ABC", "XYZ");
如果您需要访问by row或by column(例如,获取列
2
的完整映射,在您的情况下将具有键"D123"
和"J123"
),那么您可能想使用Table<String, Integer, List<String>>
和注意按需在表值中创建列表(不幸的是,computeIfAbsent
界面中没有Table
)。第三种选择是在this Guava issue中讨论
Multitable
,如@SeanPatrickFloyd在上面的评论中所述。