问题
这个问题在这里已有答案:
- 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 不同步。