zoukankan      html  css  js  c++  java
  • java ListMap使用多个key比较

    根据 menu_level,sort排序,越小的越前面。

    compareTo当前面小于后面的时候,返回-1。也就是说如果要倒序,那么只要返回1即可。

    --

    下面代码按照升序规则进行!

    --

    Collections.sort(menuList, new Comparator<Map<String, Object>>() {
                @Override
                public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                    // 进行判断
                    int cpLevel=((Integer) o1.get("menu_level")).compareTo((Integer) o2.get("menu_level"));
                    Integer sort1=(o1.get("sort")==null)?10000:(Integer) o1.get("sort");
                    Integer sort2=(o2.get("sort")==null)?10000:(Integer) o2.get("sort");
                    int cpSort=sort1.compareTo(sort2);
                    if (cpLevel==1) {
                        return 1;
                    }
                    else if(cpLevel==0) {
                        return cpSort;
                    }
                    else {
                        return -1;
                    }
                    //return ;
                }
            });

    ---

    后文是3个key的比较。

    譬如有数据表books,它们的数据如下:select * from  books order by author,price desc,publisher

    2 102 生命在于运动 lml 1000.00 中华出版社
    5 103 2020年异象 lml 90.00 福建出版社
    9 108 以史鉴今 lml 90.00 西安出版社
    4 104 奋斗在上海 lzf 1000.00 publzf
    8 107 学习方法论 lzf 99.00 中天出版社
    7 106 论自力更生的必要性 lzf 99.00 秦皇汉武
    3 1498591124 Professional Java for Web Applications Nicholas S. Williams 59.99 John Wiley & Sons
    6 105 21世纪-中国-前进 五十 83.00 附件出版社

       现在希望通过java排序(虽然一般不这么做):

       代码如下:

    @Override
        public List<Map<String, Object>> sortByNKeys() {
            String sql = "select author,price,publisher,isbn,title from books";
            List<Map<String, Object>> bookList = jdbcTp.queryForList(sql);
    
            // 使用java 8的 stream 功能进行排序
            // order by author,price desc,publisher
            /**
             * 升序返回-1,倒序返回1即可 有多个key需要比较的时候(不考虑null或者""的情况),当第n个key返回的是0的时候继续比较,如果不是
             * 则根据第n个key的比较值返回需要的结果。 譬如第1个key的比较结果是0,则比骄傲第2个, 假定第二的key的比较结果是-1
             * 如果要根据第二个倒序,则返回1;如果要根据第二个升序,则直接发那会-1即可 以此类推
             */
    
            Collections.sort(bookList, new Comparator<Map<String, Object>>() {
                @Override
                public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                    // 进行判断
                    int cp1 = ((String) o1.get("author")).compareTo((String) o2
                            .get("author"));
                    BigDecimal price1 = new BigDecimal(o1.get("price").toString());
                    BigDecimal price2 = new BigDecimal(o1.get("price").toString());
                    int cp2 = price1.compareTo(price2);
    
                    String p1 = o1.get("publisher").toString();
                    String p2 = o2.get("publisher").toString();
                    int cp3 = p1.compareTo(p2);
    
                    if (cp1 == 0) {
                        if (cp2 == 0) {
                            if (cp3 == 0) {
                                return 0;
                            } else {
                                return cp3;
                            }
                        } else {
                            return cp2 * -1;
                        }
                    } else {
                        return cp1;
                    }
                    // return ;
                }
            });
    
            return bookList;
        }

    结果输入如下:

    [{
        "author": "Nicholas S. Williams",
        "price": 59.99,
        "publisher": "John Wiley & Sons",
        "isbn": "1498591124",
        "title": "Professional Java for Web Applications"
    }, {
        "author": "lml",
        "price": 1000.00,
        "publisher": "中华出版社",
        "isbn": "102",
        "title": "生命在于运动"
    }, {
        "author": "lml",
        "price": 90.00,
        "publisher": "福建出版社",
        "isbn": "103",
        "title": "2020年异象"
    }, {
        "author": "lml",
        "price": 90.00,
        "publisher": "西安出版社",
        "isbn": "108",
        "title": "以史鉴今"
    }, {
        "author": "lzf",
        "price": 1000.00,
        "publisher": "publzf",
        "isbn": "104",
        "title": "奋斗在上海"
    }, {
        "author": "lzf",
        "price": 99.00,
        "publisher": "中天出版社",
        "isbn": "107",
        "title": "学习方法论"
    }, {
        "author": "lzf",
        "price": 99.00,
        "publisher": "秦皇汉武",
        "isbn": "106",
        "title": "论自力更生的必要性"
    }, {
        "author": "五十",
        "price": 83.00,
        "publisher": "附件出版社",
        "isbn": "105",
        "title": "21世纪-中国-前进"
    }]

    注:之所以,有所区别,是因为mysql比较的时候,默认不考虑大小写;而java字符串的CompareTo则是按照unicode编码比较进行的。

  • 相关阅读:
    html显示乱码
    java面向对象的三大特性——封装
    java面向对象——类
    16-vue-cli4.0脚手架-项目中定义全局@mixin,变量,cli中配置以供单文件组件中直接使用
    02-滚动加载
    14.oss上传封装
    13-动态组件-keepalive-滚动加载-返回位置
    09-JSONP跨域实现原理
    08- application/x-www-form-urlencoded 与 application/json区别 / querystring
    11-利用Promise的图片异步加载 / Promise封装ajax,模拟axios / Promise的finally原理
  • 原文地址:https://www.cnblogs.com/lzfhope/p/13267423.html
Copyright © 2011-2022 走看看