【问题标题】:How to sort List<Map<String,String>> by key1 descending order and key2 ascending order if key1 has same values如果 key1 具有相同的值,如何按 key1 降序和 key2 升序对 List<Map<String,String>> 进行排序
【发布时间】:2020-03-17 22:01:33
【问题描述】:

我有一个列表

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);

我按价格排序并反转结果

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

结果:

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

我想把它排序

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

如果价格相等 - 按产品编号比较,则 end 首先应该是具有较低值的 productNumber。 请帮忙!

【问题讨论】:

    标签: java list sorting


    【解决方案1】:

    如果您使用正确的比较器,则不需要反转结果(您也可以链接比较器):

        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());
    

    【讨论】:

      【解决方案2】:

      如果您分两步构建Comparator,会更容易。所以试试这个并将它们打印出来。它是这样工作的。

      • 首先它以相反的顺序对价格进行排序。
      • 然后 t 按常规顺序对产品编号进行排序以获得相同的价格。
          Comparator<Map<String, String>> comp = Comparator
              .comparing(m ->Double.parseDouble(m.get("price"))
                               ,Comparator.reverseOrder());
          comp = comp.thenComparing(m -> m.get("productNumber"));
      
      

      像这样应用它。

              List<Map<String, String>> formattedResult =
                      list.stream().sorted(comp)  
                              .collect(Collectors.toList());
      
      
              formattedResult.forEach(m -> System.out.println(
                      m.get("price") + " : " + m.get("productNumber")));
      

      打印出来

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

      【讨论】:

        【解决方案3】:

        您可以为productNumber 创建反向比较器

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

        然后使用thenComparing添加排序方法比较器

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-25
          • 2021-01-31
          • 2021-10-12
          • 2017-11-02
          相关资源
          最近更新 更多