如何解决Java HashMap <int [],整数>
我想将一个数组映射到一个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);
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。