我有一个嵌套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
不理想,我可以使用哪种替代方案?
答案 0 :(得分:1)
实际上,get
返回的是Collection
(在您的情况下为Multimap
)。 Take a look:
收集获取(@Nullable K键)
返回与key关联的值的视图集合 multimap,如果有的话。注意,当containsKey(key)为false时,这个 返回一个空集合,而不是null。
对返回的集合的更改将更新基础 多图,反之亦然。
要获取嵌套的Multimap,请执行以下操作:
Iterator<Multimap<Integer, String>> iter = doubleMultiMap.get("D123").iterator();
Multimap<Integer, String> nested = iter.next();
答案 1 :(得分:1)
如果您不需要Table
- 行或列访问等特定方法(似乎您没有,因为您想访问D123, 1
),{{1}的复合键是解决方案。使用适当的Multimap
和hashCode
创建简单的类存储字符串和整数,并正常使用multimap。假设您的复合密钥类名称为equals
(您应该考虑更好的名称),您应该可以执行以下操作:
Key
如果您需要访问by row或by column(例如,请获取列//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");
的完整映射,在您的情况下,该列将包含密钥2
和"D123"
),那么您可能希望与"J123"
达成和解并按照需要在表值中创建列表(遗憾的是,Table<String, Integer, List<String>>
接口中没有computeIfAbsent
。
第三个选项是在this Guava issue中讨论Table
,如上面评论中@SeanPatrickFloyd所述。