如何在嵌套的`ArrayListMultimap`中获取值

时间:2017-08-22 23:25:48

标签: java arraylist guava multimap

我有一个嵌套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不理想,我可以使用哪种替代方案?

enter image description here

2 个答案:

答案 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}的复合键是解决方案。使用适当的MultimaphashCode创建简单的类存储字符串和整数,并正常使用multimap。假设您的复合密钥类名称为equals(您应该考虑更好的名称),您应该可以执行以下操作:

Key

如果您需要访问by rowby 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所述。