java - 使用 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
吗?
解决方案
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);
}
推荐阅读
- vba - VBA 错误 424 对象需要,但只有一个某些 PC
- pandas - 熊猫,圆形 - 功能
- javascript - 剑道 UI 模板不起作用
- laravel - Laravel + Vue - 删除对象,但控制台返回错误
- continuous-integration - VSTS Hosted Agent (Hosted Linux Preview 2) - 环境变量不见了
- asp.net - 带有身份验证的服务到服务通信
- .htaccess - 需要使用 .htaccess 从一个 URL 重定向到另一个
- cassandra - Cassandra JVM 最大堆大小
- sql - 从两个不同的表中选择不同的记录
- c# - 基于 Json 输出的类动态添加属性