美文网首页
2021-08-12_HashMap排序学习笔记

2021-08-12_HashMap排序学习笔记

作者: kikop | 来源:发表于2021-08-12 09:05 被阅读0次

20210812_HashMap排序学习笔记

1概述

有时候数据库取回的数据,我们想根据某个字段进行排序(降序、升序),对于库里面返回的K-V(一个Key对应多个Value),我们如何处理呢,思路是这样的:

  1. 写一个自定义比较器
  2. map的entrySet转为普通list,对list进行排序
  3. 排序过后的list转为map(借助LinkedHashMap特性,读取时不改变插入顺序)

2代码实战

2.1自定义比较器

package com.kikop.util3;

import com.alibaba.fastjson.JSONObject;

import java.util.Comparator;
import java.util.Map;

/**
 * @author kikop
 * @version 1.0
 * @project Name: mytechcommon
 * @file Name: MyKvComparator
 * @desc 自定义比较器
 * @date 2020/11/22
 * @time 17:11
 * @by IDE: IntelliJ IDEA
 */
public class MyKvComparator implements Comparator<Map.Entry<String, JSONObject>> {

    private String orderColumnName;
    private String sortType;

    public MyKvComparator(String orderColumnName,String sortType) {
        this.orderColumnName = orderColumnName;
        this.sortType=sortType;
    }


    /**
     * @param o1
     * @param o2
     * @return
     */
    @Override
    public int compare(Map.Entry<String, JSONObject> o1, Map.Entry<String, JSONObject> o2) {

        try {
            // JDK 1.7
            if (o1.getValue().containsKey(this.orderColumnName) && o2.getValue().containsKey(this.orderColumnName)) {
                if("desc".equalsIgnoreCase(this.sortType)){
                    // 降序
                    return o2.getValue().getIntValue(this.orderColumnName) - o1.getValue().getIntValue(this.orderColumnName);
                } else {
                    // 升序
                    return o1.getValue().getIntValue(this.orderColumnName) - o2.getValue().getIntValue(this.orderColumnName);
                }

            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return 0;
    }


//    // 2.1.JDK8
//        Collections.sort(descOrderdList, (o1, o2) ->
////                        o2.getValue() :JSONObject
////                        o2.getValue().getIntValue(orderName):某个字段的值
//            o2.getValue().getIntValue(orderName) - o1.getValue().getIntValue(orderName)
//        );

}

2.2编写MyList2Map

package com.kikop.util3;

import com.alibaba.fastjson.JSONObject;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;


/**
 * @author kikop
 * @version 1.0
 * @project Name: mytechcommon
 * @file Name: MyList2Map
 * @desc list转 map
 * @date 2020/11/22
 * @time 17:11
 * @by IDE: IntelliJ IDEA
 */
public class MyList2Map {
    /**
     * list转 map
     *
     * @param descOrderdList
     * @return
     */
    public static HashMap convertList2OrderMap(List<Map.Entry<String, JSONObject>> descOrderdList) {

        // 为啥用 LinkedHashMap:数据的展现是按刚开始插入的顺序

        // 通过中间 list将 hashMap 转为 linkedHashMap
        HashMap linkedHashMap = new LinkedHashMap<>();

        for (int i = 0; i < descOrderdList.size(); i++) {
            linkedHashMap.put(descOrderdList.get(i).getKey(), descOrderdList.get(i).getValue());
        }

        return linkedHashMap;
    }
}

2.3排序并测试

package com.kikop.util3;


import com.alibaba.fastjson.JSONObject;

import java.util.*;


/**
 * @author kikop
 * @version 1.0
 * @project Name: mytechcommon
 * @file Name: Convert2SortedMap
 * @desc 根据orderName降序, 转换无序hashMap为有序的hashMap
 * @date 2020/11/22
 * @time 17:11
 * @by IDE: IntelliJ IDEA
 */
public class Convert2SortedMap {

    /**
     * hashedMap 根据 orderName 降序排序
     *
     * @param tempHashMap
     * @param orderColumnName
     * @param sortType
     * @return
     */
    public static Map soredHashMap(Map tempHashMap, String orderColumnName, String sortType) {

        // tempHashMap:

        // key:系统1
        // value:各种不同的业务类型及实现数量等
        // type1:100
        // type2:300

        // 1.转为List
        // 每一行是一对多,一个key,对应多个字段属性
        List<Map.Entry<String, JSONObject>> descOrderdList = new ArrayList<Map.Entry<String, JSONObject>>(tempHashMap.entrySet());


        // 2.定义比较器,并排序,但返回结果List
        // 2.1.JDK7
        Collections.sort(descOrderdList, new MyKvComparator(orderColumnName, sortType));

        // 3.将已经降序的List转为Map,并返回结果
        Map stringJSONObjectMap = MyList2Map.convertList2OrderMap(descOrderdList);
        return stringJSONObjectMap;

    }


    public static void testByDescOrderName() {

        // 按某个字段,如size,降序排列
        HashMap hashMap = new HashMap();

        JSONObject sys_Null = new JSONObject();
        sys_Null.put("size", 0);
        hashMap.put("sys_Null", sys_Null);

        JSONObject sys_A = new JSONObject();
        sys_A.put("size", 20);
        hashMap.put("Sys_A", sys_A);

        JSONObject sys_B = new JSONObject();
        sys_B.put("size", 100);
        hashMap.put("Sys_B", sys_B);

        JSONObject sys_C = new JSONObject();
        sys_C.put("size", 300);
        hashMap.put("Sys_C", sys_C);

        HashMap convertResult = (HashMap) soredHashMap(hashMap, "size", "desc");
        Iterator iterator = convertResult.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, JSONObject> currentObject = (Map.Entry<String, JSONObject>) iterator.next();
            System.out.println(currentObject.getKey() + ":" + currentObject.getValue().toJSONString());
        }
    }

    public static void main(String[] args) {

        testByDescOrderName();
    }

}

2.4输出结果

Sys_C:{"size":300}
Sys_B:{"size":100}
Sys_A:{"size":20}
sys_Null:{"size":0}

参考

相关文章

网友评论

      本文标题:2021-08-12_HashMap排序学习笔记

      本文链接:https://www.haomeiwen.com/subject/xegkbltx.html