Java中2Darrays的替代品

我有一个查找表,应该由两个单独的键值访问。 一个丑陋的方法是:

int[][] myArray = new int[256][256]; myArray[key1][key2] = 25; 

其中key1和key2是以前动态生成的键。 但这很难看。 似乎更好的方法是使用Map,但这些需要一个键,而不是两个。 Java本身不支持元组,那么我应该使用什么呢? (使用数组作为键也似乎很尴尬)。

编辑 :我说这不是特别漂亮的原因是我的数组实际上是由字符值引用的,而不是整数。 它们可以互换使用,但对我之前的问题的回答似乎暗示:

Java中的2D数组,由字符索引

这有什么难过的? 这就像2D矩阵一样简单,可以用Java编写,而且速度也很快。

如果你真的想使用一个map,只需定义你自己的Tuple类作为键 – 但要确保正确覆盖equals()hashCode() ! 我建议实现一个不可变的Tuple类,因为使用可变对象作为映射键可能会导致严重的问题。

Tuple.java

 package q5128376; import java.util.Arrays; public class Tuple { private T[] values; private int hashCode; private Tuple(T... values) { this.values = values; this.hashCode = hashCode(values); } public static  Tuple create(T... values) { return new Tuple(values); } private static  int hashCode(T... values) { return 31 * Arrays.hashCode(values); } @Override public int hashCode() { return hashCode; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!(obj instanceof Tuple)) return false; Tuple other = (Tuple) obj; if (!Arrays.equals(values, other.values)) return false; return true; } } 

你的解决方案对我来说似乎并不是很难看……它的速度非常快,代价是内存使用量很少(64 K ints)。

另一种方法是定义一个Pair类用作地图的键。

另一个解决方案是定义一个映射,该映射将int映射到int值到int值的映射:

 Map> map; 

但是,这需要创建大量的地图对象。

最好的方法取决于查找表的稀疏程度。

我同意ChrisJ的观点 ,你的二维数组并不坏。

你可以有一张地图的地图,比如

 Map> myMap; 

但这可能比你的2Darrays想法更难看。


或者,您可以将两个int键转换为一个String键,例如

 Map myMap = new HashMap(); int key1 = 3; int key2 = 4; int value = 25; myMap.put(key1 + "/" + key2, value); 

但我建议您使用您拥有的解决方案,如果您能保证任一键的最高值为255。

Interesting Posts