问题描述
我想将一个数组映射到一个arraylist,以便两个映射到同一对象的数组(如果它们是相同的)
这将输出null:
HashMap<int[],Integer> map=new HashMap<>();
map.put(new int[1],0);
System.out.println(map.get(new int[1]));
我希望输出为0。是否有一种简单的方法?我应该使用树状图吗?如何在TreeMap中做到这一点?
解决方法
如果传递了可以与数组一起使用的Comparator实例,则使用TreeMap
可以起作用。幸运的是,标准库已经有了您可以使用的方法。 Arrays.compare
:
TreeMap<int[],Integer> map = new TreeMap<>(Arrays::compare);
map.put(new int[1],1);
System.out.println(map.get(new int[1])); // output: 1
也就是说,使用可变对象(例如数组)作为映射键不是一个好主意。如果您不小心更改了用作键的数组,则映射将按预期停止工作。
HashMap
不起作用的原因是因为数组没有基于数组内容实现hashCode
或equals
方法。它们基于对象标识。
更新 Arrays.compare
已在Java 9中添加。对于Java 8,您需要自己编写Comparator。这是一个选项:
Comparator<int[]> arrayComparator = (a,b) -> {
for (int i = 0; i < Math.min(a.length,b.length); i++) {
int compare = Integer.compare(a[i],b[i]);
if (compare != 0) return compare;
}
return Integer.compare(a.length,b.length);
};