如何在Java 8中定义自定义排序比较流比较的键和值

哈里斯:

我想使用Java 8流排序的映射,并返回其键的列表。

地图的签名是:

Map<Integer, Integer> ranks = new HashMap<Integer, Integer>();

并且数据将是如[1 = 6,5 = 13,2 = 11]

有关于这一点我有排序和返回键列表两个条件。

  1. 如果键的所有值是不同的,那么排序和按降序排列返回基于列表值,例如

    input [1=6 , 5=13 , 2= 11 , 4 = 14 ]
    result [4,5,2,1]
    
  2. 如果关键的两个或多个值都具有相同的等级,然后返回这些类似按升序,而该项目的其余部分是按降序相对于它们的值,如

    input [2=6 , 5=13 , 1= 11 , 3=13 ,9 = 22 ] result [9,3,5,1,2]
    

下面是工作正常为条件1的代码片段,但不为条件2。

List<Integer> ranksList = ranks.entrySet().stream()
    .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
    .map(Map.Entry::getKey)
    .limit(k)
    .collect(Collectors.toList());
也:

您正在寻找一个自定义Comparator像这样:

.sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue()) == 0 ?
        o1.getKey().compareTo(o2.getKey()) : o2.getValue().compareTo(o1.getValue()))

从理论上讲,

  • 按降序排列第一比较值o2.getValue().compareTo(o1.getValue())

  • 如果它们相等比较升序排列的按键o1.getKey().compareTo(o2.getKey())

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有流排序和自定义比较器的java.lang.ClassCastException

您如何在Vaadin 8中设置网格以按自定义比较器排序?

如何在Java中编写自定义比较器?

如何在元组值上使用自定义比较器创建字典的排序表示?

Java的PriorityQueue中自定义比较

如何在GWT中对List <int []>进行排序?使用自定义比较器失败

带有自定义比较器的java-8 Map.entry到SortedMap的流

如何编写自定义比较器对SortedMap排序?

Java 8,按属性排序对象列表,无需自定义比较器

如何在Java Map of Map中设置自定义比较器?

如何在 Java 中为 TreeMap 编写自定义比较器?

在C ++中创建自定义地图类时,如何在模板中定义和使用比较器

如何在Java 8中从流中收集自定义类对象?

java中的自定义比较器<String>问题

使用自定义比较器在Java中创建SortedMap

Java优先队列中的自定义比较器

如何将自定义字段条目与数据库表中的值进行比较?

如何在python中定义自定义比较(0 <mytype)?

在std :: sort和std :: priority_queue中如何使用自定义比较函数的困惑

如何在pytest中进行自定义比较?

Java 8并行流中的自定义线程池

从 Java 8 中的过滤器和映射调用自定义静态函数 - 流

如何在 dart/flutter 中对自定义对象使用对象比较

如何在Python 3中使用自定义比较功能?

如何在商品中向商品添加自定义字段以进行商品比较

如何在Java 8中将流的结果收集到自定义对象的数组中

自定义排序地图在Java中8

Java自定义比较器,用于对字符串数组进行排序

如何使用Java 8流将HashMap的值设置为自定义Java对象?