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。