Java 哈希图<int[], Integer>
Java HashMap<int[], Integer>
我想将一个数组映射到一个 ArrayList
,这样两个数组如果相同则映射到同一事物。
这输出 null
:
HashMap<int[], Integer> map = new HashMap<>();
map.put(new int[1], 0);
System.out.println(map.get(new int[1]));
我希望输出为 0
。是否有捷径可寻?我应该使用 TreeMap
吗?我如何在 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
方法。它们基于对象标识。
在 Java 9 中添加了 Arrays.compare
。对于 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);
};
我想将一个数组映射到一个 ArrayList
,这样两个数组如果相同则映射到同一事物。
这输出 null
:
HashMap<int[], Integer> map = new HashMap<>();
map.put(new int[1], 0);
System.out.println(map.get(new int[1]));
我希望输出为 0
。是否有捷径可寻?我应该使用 TreeMap
吗?我如何在 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
方法。它们基于对象标识。
在 Java 9 中添加了
Arrays.compare
。对于 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);
};