20210812_HashMap排序学习笔记
1概述
有时候数据库取回的数据,我们想根据某个字段进行排序(降序、升序),对于库里面返回的K-V(一个Key对应多个Value),我们如何处理呢,思路是这样的:
- 写一个自定义比较器
- map的entrySet转为普通list,对list进行排序
- 排序过后的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}
网友评论