简体   繁体   English

排序列表<map<string,object> > 基于价值</map<string,object>

[英]Sort List<Map<String,Object>> based on value

Basically I have a List<Map<String,Object>> , and I want to sort it by the values of certain key in the map.基本上我有一个List<Map<String,Object>> ,我想按 map 中某些键的值对其进行排序。

The problem is that I do not know the type... This map can contain Strings, Integers, Doubles, Floats etc.... I would like to sort it:问题是我不知道类型……这个 map 可以包含字符串、整数、双精度数、浮点数等……我想对它进行排序:

So far迄今为止

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

It is not a great Idea since numbers are not properly sorted.... How can I handle this?这不是一个好主意,因为数字没有正确排序....我该如何处理?

You can generalize comparing numbers by comparing their double values , because they are the largest.您可以通过比较它们的双精度值概括比较数字,因为它们是最大的。 If two objects cannot be cast to numbers and the double value cannot be parsed from these objects, then compare their string values :如果两个对象无法转换为数字并且无法从这些对象中解析出双精度值,则比较它们的字符串值

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}

See also: Sort 2D List by Column Header另请参阅:按列对二维列表进行排序 Header

I think the value in the map should all be instances of Comparable, so something like this might work.我认为 map 中的值应该都是 Comparable 的实例,所以这样的事情可能会起作用。 This solution can be better than the accepted answer since you can put your own class as values(such as MyClass which implements Comparable)该解决方案可能比接受的答案更好,因为您可以将自己的 class 作为值(例如实现 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));
    }
});

Basically I have a List<Map<String,Object>> , and I want to sort it by the values of certain key in the map.基本上我有一个List<Map<String,Object>> ,我想按 map 中某个键的值对其进行排序。

The problem is that I do not know the type... This map can contain Strings, Integers, Doubles, Floats etc.... I would like to sort it:问题是我不知道类型......这个 map 可以包含字符串、整数、双精度、浮点数等......我想对其进行排序:

So far至今

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

It is not a great Idea since numbers are not properly sorted.... How can I handle this?这不是一个好主意,因为数字没有正确排序......我该如何处理?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM