简体   繁体   English

如何排序列表<Map<String,String> &gt; 如果 key1 具有相同的值,则按 key1 降序和 key2 升序

[英]How to sort List<Map<String,String>> by key1 descending order and key2 ascending order if key1 has same values

I have a List我有一个清单

List<Map<String,String>> list = new ArrayList<>();
            Map<String,String> map = new HashMap<>();
            Map<String,String> map1 = new HashMap<>();
            Map<String,String> map2 = new HashMap<>();
            map.put("productNumber", "107-001");
            map1.put("productNumber", "108-001");
            map2.put("productNumber", "109-001");
            map.put("price", "1.99");
            map1.put("price", "1.02");
            map2.put("price", "1.99");
            list.add(map);
            list.add(map1);
            list.add(map2);

I sort it by price and revers result我按价格排序并反转结果

formattedResult = list.stream().sorted(Comparator.comparing(m -> Double.parseDouble(m.get("price")))).collect(Collectors.toList());
            Collections.reverse(formattedResult);

The result of this :这样做的结果:

**price  productNumber**
1.99   109-001
1.99   107-001
1.02   108-001

I want to sort it like我想把它排序

**price  productNumber**
    1.99   107-001
    1.99   109-001
    1.02   108-001

If prices equal - compare by product number, end first should be productNumber with a lower value.如果价格相等 - 按产品编号比较,最先结束的应该是具有较低值的 productNumber。 Please help!请帮忙!

You don't need to reverse result if you use the right comparator (and you can chain comparators, too):如果您使用正确的比较器(并且您也可以链接比较器),则不需要反转结果:

    final Comparator<Map<String, String>> byPrice = Comparator.comparing(m -> Double.parseDouble(m.get("price")), Comparator.reverseOrder());

    formattedResult = list.stream().sorted(byPrice.thenComparing(m -> m.get("productNumber"))).collect(Collectors.toList());

It's easier if you build your Comparator in two steps.如果您分两步构建Comparator更容易。 So try this and print them out.所以试试这个并将它们打印出来。 It works like this.它是这样工作的。

  • first it sorts the price in reversed order.首先它以相反的顺序对价格进行排序。
  • Then t sorts the product number in regular order for equal prices.然后 t 将产品编号按相同的价格按常规顺序排序。
    Comparator<Map<String, String>> comp = Comparator
        .comparing(m ->Double.parseDouble(m.get("price"))
                         ,Comparator.reverseOrder());
    comp = comp.thenComparing(m -> m.get("productNumber"));

Apply it like so.像这样应用它。

        List<Map<String, String>> formattedResult =
                list.stream().sorted(comp)  
                        .collect(Collectors.toList());


        formattedResult.forEach(m -> System.out.println(
                m.get("price") + " : " + m.get("productNumber")));

This prints这打印

1.99 : 107-001
1.99 : 109-001
1.02 : 108-001


You can create reverse comparator for productNumber您可以为productNumber创建反向比较器

 Comparator<Map<String, String>> productNumberReversed =  Comparator.comparing((Map<String, String> mp) -> mp.get("productNumber")).reversed();

And then add it sort method comparator using thenComparing然后使用thenComparing添加排序方法比较器

formattedResult = list.stream()
           .sorted(Comparator.comparing((Map<String, String> m) -> Double.parseDouble(m.get("price"))).thenComparing(productNumberReversed)).collect(Collectors.toList());
    Collections.reverse(formattedResult);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何转换地图 <String,String> 使用lambda来“key1:value1,key2:value2,..” - How to convert Map<String,String> to “key1:value1,key2:value2,..” using lambda 如何将“ key1:value1,value,key2:value3”字符串解析为ArrayLists? - How can I parse a “key1:value1, value, key2:value3” string into ArrayLists? 在使用Java Lambda(如Map)时,如何在group-2中使用group-1结果key1 <key1, Map<key2, List<Obj> &gt;&gt; - How to use group-1 result key1 in group-2 when use Java Lambda like Map<key1, Map<key2, List<Obj>>> Java 用于遍历对象数组的语法,例如“for (String key: {”key1“, ”key2“})” - Java syntax for iterating through array of objects like “for (String key : {”key1“, ”key2“})” Java如何使用模式[key1] value1 [key2] value2 [key3] value3解析字符串 - Java How To Parse String With Pattern [key1]value1[key2]value2[key3]value3 如何将{key1 = value1,key2 = value2}之类的字符串转换为json字符串或Jsonobject? - how do I convert a String like {key1=value1, key2=value2} into a json String or Jsonobject? 按键按升序排序地图 - Sort Map in Ascending Order by Key Java在groupedRDD上触发带有key1的groupByKey并使用key2做aggregateByKey - Java spark groupByKey with key1 and do aggregateByKey with key2 on groupedRDD 如何使用JCheckBox编号/命名集合中的复选框,即key1,key2等 - How to use JCheckBox to number/name check boxes in a collection i.e. key1, key2, etc 如何按升序对地图字符串列表进行排序 - How to sort List of Map String in ascending order
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM