首页 > 解决方案 > 使用 TreeMap 时出现 ClassCastException

问题描述

我有一个TreeMap<Integer, TreeMap<int[][], Integer>> jungle. 当我尝试执行语句时

TreeMap<int[][], Integer> tempMap = new TreeMap();
int[][] matrix = {{1}};
tempMap.put(matrix, 4);

最后一行给了我

java.lang.ClassCastException: [[I cannot be cast to java.base/java.lang.Comparable at java.base/java.util.TreeMap.compare

例外。我不允许int[][]在 a 中使用 a 作为键treeMap吗?

标签: javatreemap

解决方案


a 的目的TreeMap是有一个有序的集合

基于红黑树的 NavigableMap 实现。地图根据其键的自然顺序排序,或者由地图创建时提供的比较器排序,具体取决于使用的构造函数。

你必须通过一个Comparator处理int[][]; 这是一个基于数组的总和排序的示例

class Custom2DArrayComparator implements Comparator<int[][]> {

    private static int sum(int[][] v) {
        return Arrays.stream(v).map(arr -> Arrays.stream(arr).sum())
                               .mapToInt(Integer::intValue).sum();
    }

    @Override
    public int compare(int[][] o1, int[][] o2) {
        return Integer.compare(sum(o1), sum(o2));
    }
}

利用

public static void main(String[] args) {
    TreeMap<int[][], Integer> tempMap = new TreeMap<>(new Custom2DArrayComparator());
    int[][] matrix = {{1}};
    tempMap.put(matrix, 4);
}

您可以使用匿名类来避免在外部创建一个

public static void main(String[] args) {
    TreeMap<int[][], Integer> tempMap = new TreeMap<>(new Comparator<>() {
        @Override
        public int compare(int[][] o1, int[][] o2) {
            return Integer.compare(sum(o1), sum(o2));
        }

        int sum(int[][] v) {
            return Arrays.stream(v).map(arr -> Arrays.stream(arr).sum())
                .mapToInt(Integer::intValue).sum();
        }
    });
    int[][] matrix = {{1}};
    tempMap.put(matrix, 4);
}

推荐阅读