Java中2D阵列的替代方案

时间:2011-02-26 17:04:29

标签: java map hashtable

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

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

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

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

2D Array in Java, Indexed by Characters

3 个答案:

答案 0 :(得分:3)

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

如果您真的想使用地图,只需定义自己的Tuple类作为密钥使用 - 但请确保override equals() and hashCode() correctly!我建议实现一个不可变的Tuple类,因为使用可变对象作为映射键会导致严重的问题。

Tuple.java

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.