在整数列表上的多个属性上排序

时间:2019-06-04 22:49:13

标签: java hashmap java-stream comparator

我有一个整数列表,并希望通过2个属性以排序的方式打印所有元素:列表大小和列表中元素的总和。我在流thenComparing方法上进行了阅读,但是每当我尝试使用它时都会显示一个错误。

我写了一些能正常工作的代码,但想知道是否还有其他更干净的方法可以做到这一点。预先感谢!

Map<List<Integer>, Double> entropies = new HashMap<>();

// Extra code removed

entropies.keySet()
    .stream().sorted(Comparator.comparingInt(o -> {
        List<Integer> a = (List<Integer>) o;
        return a.size();
    }).thenComparingInt(o -> {
        List<Integer> a = (List<Integer>) o;
        return a.stream().mapToInt(Integer::intValue).sum();
    }))
    .forEach(key -> logger.debug("{} => {}", key, entropies.get(key)));

与实际输出相同,但不进行强制转换。

1 个答案:

答案 0 :(得分:3)

以下方法应该起作用:

entropies.keySet()
         .stream().sorted(Comparator.<List<Integer>>comparingInt(List::size)
                              .thenComparingInt(o -> o.stream().mapToInt(Integer::intValue).sum()))
         .forEach(key -> logger.debug("{} => {}", key, entropies.get(key)));

由于Comparator.comparingInt无法将类型推断为List>。调用时的类型提示使编译器知道实际的类型。这是因为sorted方法期望使用Comparator<? super List<Integer>> comparator,因此从技术上讲,您的比较器可以具有List的任何超类,因此您需要显式指定它是哪个超类。