对于嵌套的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不理想,我可以使用什么替代方法?

java - 如何在嵌套的“ArrayListMultimap”中获取值-LMLPHP

最佳答案

如果不需要行或列访问之类的特定于Table的方法(并且似乎不需要,因为您要访问D123, 1),则可以使用Multimap的复合键。创建简单的类,使用正确的hashCodeequals存储字符串和整数,并正常使用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 rowby column(例如,获取列2的完整映射,在您的情况下将具有键"D123""J123"),那么您可能想使用Table<String, Integer, List<String>>和注意按需在表值中创建列表(不幸的是,computeIfAbsent界面中没有Table)。

第三种选择是在this Guava issue中讨论Multitable,如@SeanPatrickFloyd在上面的评论中所述。

10-08 01:49