• HashMap不能排序那就只能用TreeMap排序了


    TreeMap 的排序

    今天在公司遇到这样的需求了,前端人员想要让我对HashMap中的数据进行降序排序,我们是展示车辆信息的功能,排序要求是按照年份,

    也就是说按照年份降序排序,这里总结一下

    排序思路

    TreeMap本身就是有序的集合,但是它的有序默认是升序,也就是 1 2 3 4 5 6这样,而我们预期的结果是 6 5 4 3 2 1 所以需要对 它进行二次处理,

    如何对TreeMap进行排序处理呢?

    TreeMap只支持对键进行排序,比较,那么我们来创建TreeMap写比较

    TreeMap<String, List<Car>> tree = new TreeMap<String, List<Car>>(new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    //本来参数顺序是按照 2016<2018<2019<2020
                    int fist = Integer.parseInt(o1);//key[array]   
                    int last = Integer.parseInt(o2);//key[array+1] 
                    //
                    if (fist < last) {
                        //1) 如果要按照升序排序,则o1 小于o2,返回-1(负数),相等返回0,01大于02返回1(正数) 
                return -1; } else if (fist > last) { return 1; } else { return 0; } } });

     这里我对  compare()里面比较的逻辑是这样理解的,

    如果要按照升序排序,

    则o1 小于o2,返回-1(负数),

    相等返回0,

    01大于02返回1(正数)   

    如果要按照降序排序,

    则o1 小于o2,返回1(正数),

    相等返回0,

    01大于02返回-1(负数)  

    给TreeMap赋值

    我们先创建一些数据放入HashMap中,因为这是我们最初衷的需求,就是在遇到HashMap不能排序的时候,选择TreeMap来排序

    HashMap<String,List<Car>> hashmap=new HashMap<String,List<Car>>();
            List<Car> list = new ArrayList<>();
            list.add(new Car("奔驰", 18, 2019));
            list.add(new Car("宝马", 18, 2014));
            List<Car> list1 = new ArrayList<>();
            list1.add(new Car("玛莎拉蒂", 18, 2020));
            list1.add(new Car("迈巴赫", 18, 2018));
            List<Car> list2 = new ArrayList<>();
            list2.add(new Car("本田", 18, 2020));
            list2.add(new Car("丰田", 18, 2018));
            List<Car> list3 = new ArrayList<>();
            list3.add(new Car("Jeep", 18, 2020));
            list3.add(new Car("越野", 18, 2018));
            hashmap.put("2019", list);
            hashmap.put("2016", list1);
            hashmap.put("2020", list2);
            hashmap.put("2018", list3);

    接下来我们把HashMap中的数据一次性放入TreeMap中,当前TreeMap提供了这个方法

    tree.putAll(hashmap);

    接下来我们遍历一下

    Iterator iter = tree.entrySet().iterator();
            System.out.println("默认升序{");
            while (iter.hasNext()) {
                Map.Entry entry = (Map.Entry) iter.next();
    
                System.out.println("key=" + entry.getKey() + "	 value=" + entry.getValue().toString());
            }
            System.out.print("}");        

    打印结果如下

    默认升序{
    key=2016     value=[Car [name=玛莎拉蒂, age=18, year=2020], Car [name=迈巴赫, age=18, year=2018]]
    key=2018     value=[Car [name=Jeep, age=18, year=2020], Car [name=越野, age=18, year=2018]]
    key=2019     value=[Car [name=奔驰, age=18, year=2019], Car [name=宝马, age=18, year=2014]]
    key=2020     value=[Car [name=本田, age=18, year=2020], Car [name=丰田, age=18, year=2018]]
    }

    下面我们修改一下排序时比较的返回值来测试一下降序效果,修改的代码如下

    TreeMap<String, List<Car>> tree = new TreeMap<String, List<Car>>(new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    //本来参数顺序是按照 2016<2018<2019<2020
                    int fist = Integer.parseInt(o1);//key[array]   
                    int last = Integer.parseInt(o2);//key[array+1] 
                    //3 < 4   降序效果的
                    if (fist < last) {
                        //1) 如果要按照升序排序,则o1 小于o2,返回-1(负数),相等返回0,01大于02返回1(正数) 
                        return 1;
                    } else if (fist > last) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
            });

    打印结果:

    降序如下{
    key=2020     value=[Car [name=本田, age=18, year=2020], Car [name=丰田, age=18, year=2018]]
    key=2019     value=[Car [name=奔驰, age=18, year=2019], Car [name=宝马, age=18, year=2014]]
    key=2018     value=[Car [name=Jeep, age=18, year=2020], Car [name=越野, age=18, year=2018]]
    key=2016     value=[Car [name=玛莎拉蒂, age=18, year=2020], Car [name=迈巴赫, age=18, year=2018]]
    }

    演示完毕

  • 相关阅读:
    练习 : Flink 自定义Process_State 使用 OnTimer 连续3s大于70度 传感器报警
    练习 : 用 utils 读 存 kafak,flink sql 查询
    9. 查询user_info表中info:age大于等于18的记录
    练习: Flink Sink 将数据 保存 到 HDFS MySQL
    HBase Java API to Uitl
    练习:Flink 自定义 process 和 source
    ClickHouse 安装
    练习 : Flink TimeWindow 滑动 滚动 窗口 增量 全量 统计
    练习 : Flink 水位线 Flink_Watermark_Test
    Flink pom.xml
  • 原文地址:https://www.cnblogs.com/langjunnan/p/13170371.html
Copyright © 2020-2023  润新知