【问题标题】:Sort List<Map<String,Object>> based on value根据值对 List<Map<String,Object>> 进行排序
【发布时间】:2021-03-26 09:18:24
【问题描述】:

基本上我有一个List&lt;Map&lt;String,Object&gt;&gt;,我想按地图中某个键的值对其进行排序。

问题是我不知道类型...这张地图可以包含字符串、整数、双精度、浮点数等...我想对其进行排序:

到目前为止

List<Map<String,Object>> data = getResults();
Collections.sort(data, (o1, o2) -> (String.valueOf(o2.get("Field1")))
              .compareTo((String.valueOf(o1.get("Field1")))));

这不是一个好主意,因为数字没有正确排序...... 我该如何处理?

【问题讨论】:

    标签: java sorting collections comparator comparable


    【解决方案1】:

    我认为地图中的值应该都是 Comparable 的实例,所以这样的事情可能会起作用。此解决方案可能比公认的答案更好,因为您可以将自己的类作为值(例如实现 Comparable 的 MyClass)

    List<Map<String, Object>> data = getResults();
    
    Collections.sort(data, (o1, o2) -> {
        Object v1 = o1.get("Field1");
        Object v2 = o2.get("Field1");
        if (v1 instanceof Comparable) {
            // may throw exception if v1 and v2 are not
            // the same type, eg Double compare String
            return ((Comparable) v1).compareTo((Comparable) v2);
        } else {
            return String.valueOf(v1).compareTo(String.valueOf(v2));
        }
    });
    

    【讨论】:

      【解决方案2】:

      您可以通过比较它们的 double 值概括比较 数字,因为它们是最大的。如果两个对象不能转换为 numbers 并且不能从这些对象中解析出 double 值,那么比较它们的 string 值

      List<Map<String, Object>> data = Arrays.asList(
              Map.of("Field1", 21.2d),  // Double
              Map.of("Field1", "qqq"),  // String
              Map.of("Field1", "22.5"), // String
              Map.of("Field1", 2),      // Integer
              Map.of("Field1", 3L),     // Long
              Map.of("Field1", 23.1f)); // Float
      
      data.sort(Comparator.comparingDouble((Map<String, Object> map) -> {
          Object object = map.get("Field1");
          if (object instanceof Number) {
              return ((Number) object).doubleValue();
          } else {
              try {
                  return Double.parseDouble(String.valueOf(object));
              } catch (NumberFormatException e) {
                  return Double.NaN;
              }
          }
      }).thenComparing(map -> String.valueOf(map.get("Field1"))));
      
      data.forEach(System.out::println);
      // {Field1=2}
      // {Field1=3}
      // {Field1=21.2}
      // {Field1=22.5}
      // {Field1=23.1}
      // {Field1=qqq}
      

      另见:Sort 2D List by Column Header

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-18
        • 1970-01-01
        • 2018-09-22
        相关资源
        最近更新 更多