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" TreeMapMap 操作将表现不正确。

您还可以将 int[] 对象包装在实现 Comparable、实现 compareToequalshashCode 的 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 只是一个临时容器。