单值映射Java的多个键

单值映射Java的多个键,java,data-structures,map,multidimensional-array,Java,Data Structures,Map,Multidimensional Array,我想我的问题与此类似:但有一个重要的区别。在这个问题上(如果我对它的理解是正确的,请让我知道它是否正确),钥匙应该总是唯一的。我想要一张以下格式的地图: MyMap 钥匙不一定是唯一的。如果这没有意义,我基本上想要一个二维数组,但不是通过坐标引用元素,而是通过对象对引用元素 有人有什么想法,或者是一个图书馆在那里工作,或者是一个很好的方法来实现这一点自己?就库而言,我已经研究了Apache Commons和Guava,它们似乎都没有我想要的。Guava中的数据结构似乎满足了您通过一对对象引用值的

我想我的问题与此类似:但有一个重要的区别。在这个问题上(如果我对它的理解是正确的,请让我知道它是否正确),钥匙应该总是唯一的。我想要一张以下格式的地图: MyMap 钥匙不一定是唯一的。如果这没有意义,我基本上想要一个二维数组,但不是通过坐标引用元素,而是通过对象对引用元素


有人有什么想法,或者是一个图书馆在那里工作,或者是一个很好的方法来实现这一点自己?就库而言,我已经研究了Apache Commons和Guava,它们似乎都没有我想要的。Guava中的数据结构似乎满足了您通过一对对象引用值的要求。

我觉得您在寻找嵌套HashMap。这可能行得通,但我的直觉告诉我,实现这样一个怪物将是一个可怕的想法,无论是在性能方面还是在理智方面

如何初始化它:

    HashMap<Key1, HashMap<Key2, Value>> nestedHashMap = new HashMap<Key1, HashMap<Key2, Value>>();

免责声明:这段代码还没有经过测试,我只是一时想不起来。

我希望这个答案不会被看作是一种咆哮,但据我所知,您希望使用一个库来实现一些您可以通过使用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
方法将为所有包含的元素生成hashcode(在本例中,在您的情况下是两个,
x
y
,但可以轻松扩展以支持任意数量的元素),如果两个键的
x
y
值相同,则两个键将是相同的。如果您的pair元素不是简单的字符串,那么派生几乎任何对象的字符串表示就很简单了(例如,提供了
toString
方法的体面实现)

其思想是为该对中的每个元素都有一个唯一的字符串表示

当然,生成实心哈希代码并不简单,因此使用字符串是一个很好的选择。要生成哈希代码,只需附加成对对象的字符串表示:

public int hashcode() {
  return ('x' + x + ":y" + y).hashcode();
}
一定要提供一些分隔符。否则,对于诸如
x=ab,y=b
x=a,y=bb
之类的值,即使对象完全不同,也会得到相同的hashcode

等式与检查成对元素的值一样微不足道:

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);
}
因此,现在您可以在映射中使用
类,例如:

final Map<Pair, Whatever> map = new Hashmap<Pair, Whatever>();
// ...
final Map=new Hashmap();
// ...
基本上,hashmap通过使用键的hashcode来确定应该在哪个bucket中分配值。如果两个键具有相同的hashcode,那么equals方法将用于确定是否刚刚发生了冲突,或者它是否只是同一个键


如果您想在
树映射中使用
,则必须实现
compareTo
方法,或者在实例化此类映射时提供自己的
比较器
TreeMap
实现依赖于
compareTo
方法的结果来确定应在何处分配值。

Apache Commons Collections已完成

import org.apache.commons.collections4.keyvalue.MultiKey;
Map myMap=newhashmap();
放置(新的多键(键1,键2),值);
get(新的多键(键1,键2));

它的好处是从映射创建N维数组。

映射的整个概念是唯一的键对->值对,想要打破这个概念就意味着你应该使用与第一步不同的存储对象。你能举一个“通过对象对引用[元素]”的例子吗?这可能对我有帮助。你们看过番石榴图书馆的多重地图吗?我看过多重地图,这不是我想要的。你说得很好,我想要的不是地图,我将研究下面答案中提到的表结构,这是我没有看到的。但为了回答您的问题,正如您通过:array[0][1]引用基本2D数组中的元素一样,我希望能够执行:array[obj1][obj2]并将其映射到一个值(显然,使用不同的语法,这正是我想要的功能).Use pairs in a regular map?我接受的答案是建议使用下面的Guava Table类,因为这似乎比编写/测试/调试我自己的自定义数据结构更容易。然而,我仍然投票赞成一个同样优秀的解决方案,谢谢。equals和override方法对我不起作用。我使用了eclipse生成的方法,它工作得非常好。Source>生成hashCode()和equals()。由于。。。“我希望这个答案不会被视为一个咆哮”,但仅仅为表数据结构添加Guava lib是不值得的,因为它有大约15000个方法,所有这些都没有用处。
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);
}
final Map<Pair, Whatever> map = new Hashmap<Pair, Whatever>();
// ...
import org.apache.commons.collections4.keyvalue.MultiKey;

Map<MultiKey, ValueType> myMap = new HashMap<MultiKey, ValueType>();
myMap.put(new MultiKey(key1, key2), value);

myMap.get(new MultiKey(key1, key2));