【问题标题】:Sort on multiple properties on Integer List对整数列表上的多个属性进行排序
【发布时间】:2019-06-04 22:49:13
【问题描述】:

我有一个整数列表,并希望通过 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)));

与实际输出相同,但没有铸件会很棒。

【问题讨论】:

    标签: java hashmap java-stream comparator


    【解决方案1】:

    以下应该有效:

    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 无法将类型推断为列表>。调用时的类型提示让编译器知道实际类型。这是因为 sorted 方法需要 Comparator&lt;? super List&lt;Integer&gt;&gt; comparator,所以从技术上讲,您的比较器可以具有 List 的任何超类,因此您需要明确指定它是哪个超类。

    【讨论】:

    • 很好地总结了为什么必须添加类型提示;更多详情请访问stackoverflow.com/questions/24794924/…。第二种选择是使用o -&gt; o.stream().collect(Collectors.summingInt(i-&gt;i))
    • 谢谢,我搞定了。但更重要的是,您解释了为什么我尝试做的事情没有奏效以及我需要改变什么。另外,感谢 racraman 提供有关此选项和第二个选项的更多详细信息。
    • 你也可以使用稍微简单的Comparator.comparingInt(List&lt;Integer&gt;::size) .thenComparingInt(l -&gt; l.stream().mapToInt(Integer::intValue).sum()) 另外,一个明确类型的lambda表达式也可以工作:Comparator.comparingInt((List&lt;Integer&gt; l) -&gt; l.size()) .thenComparingInt(l -&gt; l.stream().mapToInt(Integer::intValue).sum())
    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多