【发布时间】:2017-05-22 13:01:53
【问题描述】:
我必须制作键为 int[] 且值为双精度的排序映射。它不能被交换,因为 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));
线程“AWT-EventQueue-0”java.lang.ClassCastException 中的异常: [我无法转换为 java.lang.Comparable at java.util.TreeMap.compare(TreeMap.java:1294) 在 java.util.TreeMap.put(TreeMap.java:538) 在 com.pszt_organism.Organisms.test(Organisms.java:46)
我在这个话题中找到了方法sortByValue(Map<K, V> map):java8 example by Carter Page
我认为 TreeMap 对 int 的排序表有问题。如何解决?
编辑:
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
));
}
【问题讨论】:
-
能否分享一下你的sortByValue函数实现
-
您需要将
int[]包装到一个实现Comparable以及hashcode()和equals()方法的类中 -
如果您希望它按值排序,那么为什么还要麻烦按键排序的地图实现呢?