多键到单值映射 Java

我认为我的问题与此类似:如何实现具有多个键的Map?但有一个重要的区别。在这个问题中(如果我对它的理解是正确的,如果不是,请让我知道),密钥应该始终是唯一的。我想在表单中有一个地图:MyMap,其中键不一定是唯一的。如果这没有意义,我基本上想要一个2维数组,但不是通过坐标来引用元素,而是通过成对的对象来引用它们。

有人对这个工作库或我自己实现它的好方法有任何想法吗?就图书馆而言,我看过Apache Commons和Guava,似乎都没有我想要的东西。


答案 1

Guava 中的 Table 数据结构似乎满足了您通过一对对象引用值的要求。


答案 2

我希望这个答案不会被视为咆哮,但据我所知,你想使用一个库来实现一些你可以使用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) {...}
}

该方法将生成所有包含元素的哈希码(在本例中为两个,在本例中为两个,但可以轻松扩展以支持任意数量的元素),如果两个键具有相同的和值,则它们将相同。如果您的对元素不是简单的字符串,那么派生几乎任何对象的字符串表示形式都是微不足道的(例如,提供该方法的体面实现)。hashcodexyxytoString

这个想法是为对中的每个元素提供唯一的字符串表示形式。

当然,生成可靠的哈希码并非易事,因此使用字符串是一个很好的选择。要生成哈希码,您只需追加对对象的字符串表示形式:

public int hashcode() {
  return ('x' + x + ":y" + y).hashcode();
}

请务必提供一些分隔符。否则,对于 诸如 、 和 等值,即使对象完全不同,您也会获得相同的哈希码。x=ab, y=bx=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<Pair, Whatever> map = new Hashmap<Pair, Whatever>();
// ...

基本上,哈希映射的工作原理是使用键的哈希代码来确定应在哪个存储桶中分配值。如果两个键具有相同的哈希码,则将使用 equals 方法来确定是否刚刚发生冲突,或者它是否只是相同的键。

如果要在 中使用类,则必须实现该方法,或者在实例化此类映射时提供自己的方法。 实现依赖于方法的结果来确定应将值分配到何处。PairTreeMapcompareToComparatorTreeMapcompareTo


推荐