Java提供IdentityHashMap,当您想要按==
而不是equals
方法比较对象时,这是完美的。
Guava为Map<Key, Set<Value>
提供了SetMultimap的精美包装器。但是没有使用身份对象比较(==
)的实现。
有什么比平原更好
IdentityHashMap<Key, IdentityHashSet<Value>>
?
一些IdentitySetMultimap<Key, Value>
将是理想的。
答案 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看到还有其他方法可以做到这一点。)