单值映射Java的多个键
我认为我的问题与此类似: 如何使用多个键实现Map? 但有一个重要的区别。 在那个问题中(如果我对它的理解是正确的,请告诉我,如果不是),那些键应该始终是唯一的。 我希望在表单中有一个Map: MyMap ,其中键不一定是唯一的。 如果这没有意义,我基本上想要一个二维数组,但不是通过坐标引用元素,我想通过成对的对象来引用它们。
任何人都对这个有效的图书馆或自己实施的好方法有任何想法吗? 就图书馆而言,我看过Apache Commons和Guava,似乎都没有我想要的东西。
Guava中的Table数据结构似乎满足了您通过一对对象引用值的要求。
我希望这个答案不会被视为咆哮,但据我所知,你想使用一个库,你可以用一个开箱即用的jdk以一种微不足道的方式实现。
无论如何,您提到要使用一对对象访问元素。 您可以创建一个用于保存键的类,例如
public class Pair { // string represntation of an object private final String x; private final String y; // ctor, getters... public int hashcode() {...} public boolean equals(Object other) {...} }
hashcode
方法将为所有包含元素生成哈希码(在这种情况下,在您的情况下为两个, x
和y
,但可以很容易地扩展以支持任意数量的元素),如果它们具有两个键,则两个键将是相同的x
和y
值相同。 如果你的pair元素不是简单的字符串,那么派生几乎任何对象的字符串表示都是微不足道的(例如,提供一个体面的toString
方法实现)。
我们的想法是为对中的每个元素提供唯一的字符串表示。
当然,生成实体哈希码并非易事,因此使用字符串是一个很好的选择。 要生成哈希码,您只需附加对对象的字符串表示:
public int hashcode() { return ('x' + x + ":y" + y).hashcode(); }
一定要提供一些分隔符。 否则,对于诸如x=ab, y=b
和x=a, y=bb
,即使对象完全不同,您也将获得相同的哈希码。
平等与检查对中元素的价值一样微不足道:
public boolean equals(Object other) { // if other is not null and is an instance of Pair final Pair otherPair = (Pair)other; return this.x.equals(otherPair.x) && this.y.equals(otherPair.y); }
所以,现在你可以在地图中使用你的Pair
类,例如:
final Map map = new Hashmap(); // ...
Basicaly,hashmap的工作原理是使用密钥的哈希码来确定应该在哪个桶中分配值。 如果两个键具有相同的哈希码,则equals方法将用于确定是否刚发生冲突,或者它是否只是相同的键。
如果要在TreeMap
使用Pair
类,则必须实现compareTo
方法,或在实例化此类映射时提供自己的Comparator
。 TreeMap
实现依赖于compareTo
方法的结果来确定应该在何处分配值。
Apache Commons Collections有MultiKey 。
import org.apache.commons.collections4.keyvalue.MultiKey; Map myMap = new HashMap(); myMap.put(new MultiKey(key1, key2), value); myMap.get(new MultiKey(key1, key2));
它具有从Map创建N维数组的好处。
听起来像你正在寻找一个嵌套的HashMap。 这可能有用,但我的直觉说实施这样一个怪物将是一个可怕的想法,无论是表现明智还是理智。
你如何初始化它:
HashMap> nestedHashMap = new HashMap>();
添加值:
Key1 first; Key2 second; Value data; HashMap tempMap = new HashMap(); tempMap.put(second, data); nestedHashMap.put(first, tempMap);
获取数据:
Key1 first; Key2 second; Value data; data = nestedHashMap.get(first).get(second);
免责声明:此代码尚未经过测试,它刚刚脱颖而出。