密钥行为和值行为的某些组合是否不适合多图实现?

时间:2016-07-08 10:33:59

标签: data-structures guava

我一直在查看mutable multimap implementations of Guava并注意到大多数键和值实现组合都不存在。

Java提供3个Map实现,2个List实现和3个Set实现。 Map实现控制键行为,SetList实现控制值行为。从理论上讲,可以有3 x (2+3) = 15种组合。番石榴提供其中的5种。

其他组合是否没有意义(它们更糟)?他们不可能实施吗?它们没问题但是没有必要这么多组合吗?

(请注意,虽然我引用Java,但这是数据结构中的一个问题,并不限于特定语言。可以使用任何可以显示哈希表,数组,链接列表等的语言。)< / em>的

1 个答案:

答案 0 :(得分:4)

使用MultimapBuilder拥有所有这些组合,例如TreeMap - &gt; ArrayList可以使用以下内容构建:

ListMultimap<String, Integer> treeListMultimap =
    MultimapBuilder.treeKeys().arrayListValues().build();

想要SetMultimapEnumSet”值“?使用:

SetMultimap<Integer, MyEnum> hashEnumMultimap =
    MultimapBuilder.hashKeys().enumSetValues(MyEnum.class).build();

(取自documentation的例子。)

如果你想要更多的可能性,不仅限于JDK地图/集合实现,你总是可以构建自己的多重映射,比如使用静态方法:Multimaps.new{List,Set,SortedSet}Multimap

ListMultimap<String, Integer> myListMultimap = 
    Multimaps.newListMultimap(new HashMap<>(), MyList::new);

修改

(直接回答下面的问题。)

  

其他组合是否没有意义(它们更糟糕)?

它们有意义,它们在现实世界中更为罕见。

  

他们无法实施吗?

他们有可能,为什么不呢?

  

它们没问题,但不需要这么多组合吗?

见上文 - 您可以使用new*MultimapMultimapBuilder构建此类多地图。他们(即Guava团队)总是在Google内部代码库中获取使用统计信息,所以我猜他们选择了最常用的代码库。