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不起作用的原因是因为数组没有基于数组内容实现hashCodeequals方法。它们基于对象标识。

更新 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);
    };