在番石榴或其他地方有IdentitySetMultimap吗?

时间:2016-03-02 09:56:16

标签: java collections guava identity multimap

Java提供IdentityHashMap,当您想要按==而不是equals方法比较对象时,这是完美的。

Guava为Map<Key, Set<Value>提供了SetMultimap的精美包装器。但是没有使用身份对象比较(==)的实现。

有什么比平原更好 IdentityHashMap<Key, IdentityHashSet<Value>>? 一些IdentitySetMultimap<Key, Value>将是理想的。

3 个答案:

答案 0 :(得分:7)

您可以将Multimaps.newSetMultimap(Map, Supplier)Maps.newIdentityHashMap()Sets.newIdentityHashSet()

一起使用
public static <K, V> SetMultimap<K, V> newIdentitySetMultimap() {
    return Multimaps.newSetMultimap(Maps.newIdentityHashMap(), Sets::newIdentityHashSet);
}

通过指定不同的映射或集合实现,您还可以仅对键使用标识比较,或仅使用值。上面的示例将使用两者的身份比较。

答案 1 :(得分:3)

使用Eclipse Collections,您当前可以为值设置标识,但不能设置密钥的标识映射(截至今天)。如果您只需要为值设置标识,则以下内容将起作用。

MutableSetMultimap<String, String> multimap =
    UnifiedSetWithHashingStrategyMultimap.newMultimap(
        HashingStrategies.identityStrategy());
multimap.put("a", "a");
multimap.put("a", new String("a"));
multimap.put("a", new String("a"));

Assert.assertEquals(3, multimap.get("a").size());

您还可以定义自己的HashingStrategy实施,以便与UnifiedSetWithHashingStrategyMultimap一起使用。

注意:我是Eclipse Collections的提交者。

答案 2 :(得分:2)

番石榴没有IdentitySetMultimap。我们通常建议您执行您提出的建议或创建SetMultimap<Equivalence.Wrapper<Key>, Equivalence.Wrapper<Value>>。在查询/修改集合之前,您可以使用Equivalence.identity().wrap(...)来包装密钥和值。

(更新:您可以从another answer看到还有其他方法可以做到这一点。)