【问题标题】:Java HashMap<int[], Integer> [duplicate]Java HashMap<int[], Integer> [重复]
【发布时间】:2020-11-30 16:32:27
【问题描述】:

我想将一个数组映射到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 中执行此操作?

【问题讨论】:

    标签: java arrays hashmap implementation treemap


    【解决方案1】:

    如果您传入可与数组一起使用的 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);
    };
    

    【讨论】:

    • 我已经更新了答案,为 Java 8 添加了 Arrays.compare 的可能替代实现
    • 这适用于 Java 7 及以下版本吗?
    • 那么如何让我的 Java 8 程序正常工作?我应该把这个比较器放在哪里?
    • 对于 Java 7,您必须将 arrayComparator 重写为实现 Comparator 接口的类,因为 Java 7 缺少 lambda 表达式功能。对于 Java 6,您必须进行更多更改,对于 Java 5 则更是如此。但请注意,Java 8 早在 6 年前就问世了
    • new TreeMap&lt;&gt;(arrayComparator)
    猜你喜欢
    • 2014-07-19
    • 1970-01-01
    • 2020-11-08
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 2019-08-11
    相关资源
    最近更新 更多