[英]Alternatives to 2D Arrays in Java
我有一个查找表,应该通过两个单独的键值进行访问。 一种这样做的丑陋方法是:
int[][] myArray = new int[256][256];
myArray[key1][key2] = 25;
其中key1和key2是先前动态生成的密钥。 但是,这很丑陋。 似乎更好的方法是使用Map,但是那些需要一个键,而不是两个。 Java本机不支持元组,那么我应该使用什么呢? (使用数组作为键似乎也很尴尬)。
编辑 :我说这不是特别漂亮的原因是我的数组实际上是由字符值而不是整数引用的。 它们可以互换使用,但是对我之前的问题的回答似乎暗示了其他方面:
那有什么丑陋的? 这与Java中的2D矩阵一样简单,而且速度也很快。
如果您真的想使用地图,只需定义自己的Tuple
类以用作键-但请确保正确覆盖equals()
和hashCode()
! 我建议实现一个不变的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;
}
}
您的解决方案对我来说似乎并不难看...它的速度非常快,但占用的内存很少(64 K int)。
一种替代方法是定义一个Pair
类,用作地图的键。
另一个解决方案是定义一个将int映射到map将int映射到int值的映射:
Map<Integer, Map<Integer, Integer>> map;
但是,这将需要创建许多地图对象。
最佳方法取决于查询表的稀疏程度。
我同意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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.