使用 TreeMap 时出现 ClassCastException

ClassCastException when using TreeMap

我有一个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[][] 作为 treeMap 中的键吗?

正如 Johannes 的评论所指出的那样,您需要实现自己的逻辑才能使您的密钥具有可比性。您可以创建一个实现 Comparator 的 class 并在 TreeMap.

的初始化时将其作为参数传递

请注意 default/overriden compare 方法也有效,因为 arrays只是 Objects.

您甚至可以在单个 class:

中实现您希望插入不同 Maps 的不可比较 Object 键的所有逻辑
public class NonCompObjectKeyComparator implements Comparator<Object> 
{         
    @Override
    public int compare(Object o1, Object o2) 
    {
       if (o1 instanceof int[][])
       {
         //((int[][])o1),((int[][])o2)//
       }
       else if (o1 instanceof String[])
       {
         //((String[])o1),((String[])o2)//
       }
       else if (o1 instanceof <OtherNonComparableObjType>)
       {
         //...
       }
       //...          
       return 0;
    }
}

然后你得到了你的überComparator

Comparator<Object> maCompa = new NonCompObjectKeyComparator();

TreeMap<int[][], Integer> tempMap   = new TreeMap(maCompa);
TreeMap<String[], String> sArrayMap = new TreeMap(maCompa);

int[][] matrix = {{1}};
tempMap.put(matrix, 4);

String[] sKey = {"a"};
sArrayMap.put(sKey, "anotherWierdMap");

为了创建特定的 int[][] 比较器,只需:

public class CustomKeyComparator implements Comparator<int[][]> {    

    public int compare(int[][] a1, int[][] a2) {
        //your logic here
        return 0;
    }
}

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

TreeMap 的目的是让集合有序

A Red-Black tree based NavigableMap implementation. The map is sorted according to the natural ordering of its keys, or by a Comparator provided at map creation time, depending on which constructor is used.

您必须传递一个 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);
}

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

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