• Java 根据Map的值对 List<Map<String, Object>> 进行排序


    对 List> 类型数据的排序

    有一个Map列表, 需要对这个列表, 按Map的某几个value进行排序, 并且还要分别指定正序或者倒序. 这个实现在数据库中是非常简单的, 一串 order by col1 asc, col2 desc 搞定, 但是在Java中, 就会比较啰嗦.
    记录一下, 在对比两个具体值的时候, 区分类型实现的compare方法.

    /**
     * 对List<Map>排序, 基于多个键
     * @param sorts 排序字段和方向列表
     * @return 排序后的列表
     */
    private Comparator<Map<String, Object>> mapComparator(List<Pager.Sort> sorts) {
        return (o1, o2) -> {
            int ret = 0;
            for (Pager.Sort sort : sorts) {
                Object v1 = o1.get(sort.field);
                Object v2 = o2.get(sort.field);
                ret = singleCompare(v1, v2, sort.order == Pager.Order.ASC);
                if (ret != 0) {
                    break;
                }
            }
            return ret;
        };
    }
    
    private int singleCompare(Object av, Object bv, boolean asc) {
        int ret;
        if (av == null && bv == null) {
            ret = 0;
        } else if (av == null) {
            ret = -1;
        } else if (bv == null) {
            ret = 1;
        } else  if (av instanceof BigDecimal) {
            ret = ((BigDecimal)av).compareTo((BigDecimal)bv);
        } else if (av instanceof Number) {
            if (((Number)av).doubleValue() != ((Number)bv).doubleValue()) {
                ret = ((Number)av).doubleValue() > ((Number)bv).doubleValue()? 1 : -1;
            } else {
                ret = 0;
            }
        } else if (av instanceof Date) {
            ret = ((Date)av).compareTo((Date)bv);
        } else {
            ret = String.valueOf(av).compareTo(String.valueOf(bv));
        }
        if (!asc) {
            return -ret;
        }
        return ret;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    调用

    List<Map<String, Object>> sorted = list.stream()
                    .sorted(mapComparator(pager.getSorts()))
                    .collect(Collectors.toList());
    
    • 1
    • 2
    • 3

    在 singleCompare 这个方法中, 要注意大于, 等于, 小于三种情况都要明确判断, 不能漏, 否则在sorted中会出现"Comparison method violates its general contract!"错误.

  • 相关阅读:
    日文翻译-在线免费日文翻译软件
    springboot MongoDB 主从 多数据源
    Android 音频开发入门指南
    Pycharm 常用快捷键
    [Linux入门]---管理者操作系统
    八大学习方法(金字塔模型、费曼学习法、布鲁姆学习模型)
    Golang与Java的并发性能对比
    odoo16 一个比较复杂的domain
    ImageJ软件
    从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 核心类持久化存储
  • 原文地址:https://blog.csdn.net/michaelchain/article/details/126531601