TreeMap<int[],Double> 初始化和按值排序
TreeMap<int[],Double> initialisation and sorting by value
我必须制作键为 int[] 且值为 double 的排序映射。它不能被交换,因为 double 将被复制。此外,地图将按值排序,最后的 x 个值将被删除。
我试过
Map<int[],Double> map = new TreeMap<>();;
int[] i = {0,1,1,0};
map.put(i,8.5); // ERROR HERE Organisms.java:46
i = new int[]{0,0,0,0};
map.put(i,30.0);
System.out.println("sorted" + sortByValue(map));
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException:
[I cannot be cast to java.lang.Comparable at
java.util.TreeMap.compare(TreeMap.java:1294) at
java.util.TreeMap.put(TreeMap.java:538) at
com.pszt_organism.Organisms.test(Organisms.java:46) <-- MARKED ERROR
我在这个主题中找到方法 sortByValue(Map<K, V> map)
:java8 example by Carter Page
我想 TreeMap 在对 int table 进行排序时有问题。如何解决?
编辑:
private <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
return map.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(/*Collections.reverseOrder()*/))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new
));
}
问题是 Java 数组类型没有实现 Comparable
。
解决方案:实施一个 Comparator
来比较您的 int[]
键,并将一个实例作为参数传递给 TreeMap
构造函数。
但是,这仅在 int[]
对象在用作键时未发生变化的情况下才有效。如果你改变它们,那么你将 "break" TreeMap
和 Map
操作将表现不正确。
您还可以将 int[]
对象包装在实现 Comparable
、实现 compareTo
、equals
和 hashCode
的 class 中。关于突变的同样警告也适用于这种方法。
int[]
数组不适合用作 Map
中的键(有关简要说明,请参阅 this Q&A;它讨论数组列表,但相同的逻辑适用于数组以及)。
如果您无论如何都打算使用数组作为键,请谨慎行事:
由于 int[]
不是 Comparable
,如果不提供用于比较数组的逻辑片段,则不能将其用作键。
以下是您的操作方法:
Map<int[],Double> map = new TreeMap<>(
new Comparator<int[]>() {
@Override public int compare(int[] lhs, int[] rhs) {
int len = Math.min(lhs.length, rhs.length);
for (int i = 0 ; i != len ; i++) {
if (lhs[i] != rhs[i]) {
return Integer.compare(lhs[i], rhs[i]);
}
}
// If we're here, common elements match up;
// hence, the longer of the two arrays wins.
return Integer.compare(lhs.length, rhs.length)
}
}
);
您无需使用 TreeMap
即可使用该排序方法。只需使用不同的 Map
。该排序方法为结果创建了一个新的 LinkedHashMap
,因此作为参数传递的 Map
只是一个临时容器。
我必须制作键为 int[] 且值为 double 的排序映射。它不能被交换,因为 double 将被复制。此外,地图将按值排序,最后的 x 个值将被删除。
我试过
Map<int[],Double> map = new TreeMap<>();;
int[] i = {0,1,1,0};
map.put(i,8.5); // ERROR HERE Organisms.java:46
i = new int[]{0,0,0,0};
map.put(i,30.0);
System.out.println("sorted" + sortByValue(map));
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [I cannot be cast to java.lang.Comparable at java.util.TreeMap.compare(TreeMap.java:1294) at java.util.TreeMap.put(TreeMap.java:538) at com.pszt_organism.Organisms.test(Organisms.java:46) <-- MARKED ERROR
我在这个主题中找到方法 sortByValue(Map<K, V> map)
:java8 example by Carter Page
我想 TreeMap 在对 int table 进行排序时有问题。如何解决?
编辑:
private <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
return map.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(/*Collections.reverseOrder()*/))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(e1, e2) -> e1,
LinkedHashMap::new
));
}
问题是 Java 数组类型没有实现 Comparable
。
解决方案:实施一个 Comparator
来比较您的 int[]
键,并将一个实例作为参数传递给 TreeMap
构造函数。
但是,这仅在 int[]
对象在用作键时未发生变化的情况下才有效。如果你改变它们,那么你将 "break" TreeMap
和 Map
操作将表现不正确。
您还可以将 int[]
对象包装在实现 Comparable
、实现 compareTo
、equals
和 hashCode
的 class 中。关于突变的同样警告也适用于这种方法。
int[]
数组不适合用作 Map
中的键(有关简要说明,请参阅 this Q&A;它讨论数组列表,但相同的逻辑适用于数组以及)。
如果您无论如何都打算使用数组作为键,请谨慎行事:
由于 int[]
不是 Comparable
,如果不提供用于比较数组的逻辑片段,则不能将其用作键。
以下是您的操作方法:
Map<int[],Double> map = new TreeMap<>(
new Comparator<int[]>() {
@Override public int compare(int[] lhs, int[] rhs) {
int len = Math.min(lhs.length, rhs.length);
for (int i = 0 ; i != len ; i++) {
if (lhs[i] != rhs[i]) {
return Integer.compare(lhs[i], rhs[i]);
}
}
// If we're here, common elements match up;
// hence, the longer of the two arrays wins.
return Integer.compare(lhs.length, rhs.length)
}
}
);
您无需使用 TreeMap
即可使用该排序方法。只需使用不同的 Map
。该排序方法为结果创建了一个新的 LinkedHashMap
,因此作为参数传递的 Map
只是一个临时容器。