如何使用多个键实现Map? [重复]

问题

这个问题在这里已有答案:

  • Java Collection的多个索引 - 最基本的解决方案? 14个答案

我需要一个行为类似于Map的数据结构,但使用多个(不同类型的)键来访问其值。
(我们不要太笼统,让我们说两个keys)
密钥保证是唯一的。
就像是:

MyMap<K1,K2,V> ...

使用以下方法:

getByKey1(K1 key)...
getByKey2(K2 key)...
containsKey1(K1 key)...
containsKey2(K2 key)...

你有什么建议吗?
我唯一能想到的是:
编写一个内部使用两个Maps的类。

编辑有些人建议我使用a元组,a,或类似作为Java的 Map 的关键字,但这对我不起作用
如上所述,我必须能够仅通过指定的两个键中的一个来搜索值。
Map 使用密钥的哈希码并检查它们的相等性。


#1 热门回答(85 赞)

两张 Map 。 OneMap<K1, V>和oneMap<K2, V>。如果必须有单个接口,请编写实现所述方法的包装类。


#2 热门回答(51 赞)

Commons-collections提供你正在寻找的东西:http://commons.apache.org/proper/commons-collections/javadocs/api-release/index.html

看起来现在是commons-collections的类型。

可以在以下位置找到打字版本:https://github.com/megamattron/collections-generic

这将完全支持你的用例:

MultiKeyMap<k1,k2,...,kn,v> multiMap = ??

#3 热门回答(40 赞)

我仍然会建议2 Map 解决方案,但有一个推特

Map<K2, K1> m2;
Map<K1, V>  m1;

此方案允许你拥有任意数量的键"别名"。

它还允许你通过任何键更新值,而不会使 Map 不同步。