我有一个查找表,应该由两个单独的键值访问。一个丑陋的方法是:
int[][] myArray = new int[256][256];
myArray[key1][key2] = 25;
其中key1和key2是以前动态生成的键。但这很难看。似乎更好的方法是使用Map,但那些需要一个键,而不是两个。 Java本身不支持元组,所以我应该使用什么呢? (使用数组作为键也似乎很尴尬)。
编辑:我说这不是特别漂亮的原因是我的数组实际上是由字符值引用的,而不是整数引用。它们可以互换使用,但对我之前的问题的回答似乎暗示:
答案 0 :(得分:3)
那有什么难过的?这就像2D矩阵一样简单,可以用Java编写,而且速度也很快。
如果您真的想使用地图,只需定义自己的Tuple
类作为密钥使用 - 但请确保override equals()
and hashCode()
correctly!我建议实现一个不可变的Tuple
类,因为使用可变对象作为映射键会导致严重的问题。
package q5128376;
import java.util.Arrays;
public class Tuple<T>
{
private T[] values;
private int hashCode;
private Tuple(T... values)
{
this.values = values;
this.hashCode = hashCode(values);
}
public static <T> Tuple<T> create(T... values)
{
return new Tuple<T>(values);
}
private static <T> 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;
}
}
答案 1 :(得分:2)
你的解决方案对我来说似乎并不是很难看......它的速度非常快,代价是内存使用量很少(64 K ints)。
另一种方法是定义一个Pair
类作为地图的关键字。
另一个解决方案是定义一个映射,将整数映射到映射到int值的映射:
Map<Integer, Map<Integer, Integer>> map;
但是,这需要创建大量的地图对象。
最佳方法取决于查找表的稀疏程度。
答案 2 :(得分:0)
我同意ChrisJ你的二维数组一点都不差。
您可以拥有地图地图,例如
Map<Integer, Map<Integer, Integer>> myMap;
但这可能比你的2D阵列想法更难看。
或者,您可以将两个int键转换为一个String键,如
Map<String, Integer> myMap = new HashMap<String, Integer>();
int key1 = 3;
int key2 = 4;
int value = 25;
myMap.put(key1 + "/" + key2, value);
但我建议您使用您拥有的解决方案,如果您能保证任一键的最高值为255.