键行为和值行为的某些组合是否不适合多图实现?
Are some combinations of keys behaviors and values behavior not appropriate for a multimap implementation?
我一直在查看可变 multimap implementations of Guava 并注意到大多数键和值实现组合都不存在。
Java 提供了 3 个 Map
实现、2 个 List
实现和 3 个 Set
实现。 Map
实现控制键行为,Set
和 List
实现控制值行为。理论上可以有3 x (2+3) = 15
种组合。 Guava 提供其中的 5 个。
其他组合没有意义吗(它们只是更糟)?他们不可能实施吗?可以吗,但是没必要那么多组合?
(注意,我指的是Java,这是一个数据结构的问题,不限于特定的语言。任何可以体现哈希表,数组,链表的语言等等都可以使用。)
使用 MultimapBuilder
获得所有这些组合,例如。 TreeMap
-> ArrayList
可以构造为:
ListMultimap<String, Integer> treeListMultimap =
MultimapBuilder.treeKeys().arrayListValues().build();
想要 SetMultimap
和 EnumSet
"values"?使用:
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);
编辑:
(下面直接回答您的问题。)
Do the other combination make no sense (they are just worse)?
它们很有道理,只是在现实世界中比较罕见。
Are they not possible to implement?
它们是可能的,为什么不呢?
Are they fine but there is no need for so many combinations?
见上文 - 您可以使用 new*Multimap
或 MultimapBuilder
构造此类多图。他们(即 Guava 团队)总是在 Google 内部代码库中进行使用统计,所以我猜他们选择了最常用的。
我一直在查看可变 multimap implementations of Guava 并注意到大多数键和值实现组合都不存在。
Java 提供了 3 个 Map
实现、2 个 List
实现和 3 个 Set
实现。 Map
实现控制键行为,Set
和 List
实现控制值行为。理论上可以有3 x (2+3) = 15
种组合。 Guava 提供其中的 5 个。
其他组合没有意义吗(它们只是更糟)?他们不可能实施吗?可以吗,但是没必要那么多组合?
(注意,我指的是Java,这是一个数据结构的问题,不限于特定的语言。任何可以体现哈希表,数组,链表的语言等等都可以使用。)
使用 MultimapBuilder
获得所有这些组合,例如。 TreeMap
-> ArrayList
可以构造为:
ListMultimap<String, Integer> treeListMultimap =
MultimapBuilder.treeKeys().arrayListValues().build();
想要 SetMultimap
和 EnumSet
"values"?使用:
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);
编辑:
(下面直接回答您的问题。)
Do the other combination make no sense (they are just worse)?
它们很有道理,只是在现实世界中比较罕见。
Are they not possible to implement?
它们是可能的,为什么不呢?
Are they fine but there is no need for so many combinations?
见上文 - 您可以使用 new*Multimap
或 MultimapBuilder
构造此类多图。他们(即 Guava 团队)总是在 Google 内部代码库中进行使用统计,所以我猜他们选择了最常用的。