List<Map<String,Object>>自定義排序
參考文檔: https://segmentfault.com/a/1190000039980921?utm_source=sf-similar-article
需求
我需要 按照 資深 > 高級 > 中級 >初級 的排序方式
并且先寫 開發 然后寫測試
最終排序
資深開發 > 高級開發 > 中級開發 >初級開發 > 資深測試 > 高級測試 > 中級測試 >初級測試
寫入Word模板表格中
@PostMapping("/writeOneTable")
public void writeSycleOneTable(MultipartFile multipartFile) {
Map<String, Object> wordDataMap = new HashMap<String, Object>(); // 存儲報表全部數據
Map<String, Object> parametersMap = new HashMap<String, Object>();// 存儲報表中不循環的數據
List<UserInfoDO> userInfoDOList = userInfoMapper.listAll();
WordTemplate template = null;
FileInputStream fileInputStream = null;
FileOutputStream fos = null;
// File file = new File("C:\\Users\\18980\\Desktop\\2024年6月17日_需求開發\\簡歷模板.docx"); //可改成你本地模板文件所在目錄
// 將上傳的MultipartFile轉換為File對象
File file = null; //可改成你本地模板文件所在目錄
try {
file = convertMultipartFileToFile(multipartFile);
// file = new File("C:\\Users\\18980\\Desktop\\2024年6月17日_需求開發\\〖空〗簡歷模板以及要求_可修改.docx");
} catch (IOException e) {
throw new RuntimeException(e);
}
String picPathDir = "C:\\Users\\18980\\Desktop\\2024年7月3日_簡歷需求\\測試崗\\證件照\\擬派團隊成員簡歷表\\";
String outputPath = "C:\\Users\\18980\\Desktop\\2024年7月3日_簡歷需求\\〖正式人員名單〗\\導出數據\\";
List<Map<String, Object>> downSurgeTable = new ArrayList<Map<String, Object>>();
for (int k = 0; k < userInfoDOList.size(); k++) {
UserInfoDO userInfoDO1 = userInfoDOList.get(k);
Map<String, Object> map = new HashMap<>();
map.put("userName", userInfoDO1.getUserName());
map.put("education", userInfoDO1.getEducation());
map.put("major", userInfoDO1.getMajor());
map.put("profCertification", userInfoDO1.getProfCertification());
map.put("workYears", userInfoDO1.getWorkYears());
map.put("title", userInfoDO1.getTitle());
map.put("jobResponse", userInfoDO1.getJobResponse());
map.put("itLevel", userInfoDO1.getItLevel());
downSurgeTable.add(map);
}
Comparator<Map<String, Object>> comparator = (a1, a2) -> {
String a1Level = (String) a1.get("itLevel");
String a2Level = (String) a2.get("itLevel");
if (a1Level.equals("資深") && a2Level.equals("高級")) {
return 1;
} else if (a1Level.equals("資深") && a2Level.equals("中級")) {
return 1;
} else if (a1Level.equals("資深") && a2Level.equals("初級")) {
return 1;
} else if (a1Level.equals("中級") && a2Level.equals("高級")) {
return -1;
} else if (a1Level.equals("中級") && a2Level.equals("資深")) {
return -1;
} else if (a1Level.equals("中級") && a2Level.equals("初級")) {
return 1;
} else if (a1Level.equals("初級") && a2Level.equals("資深")) {
return -1;
} else if (a1Level.equals("初級") && a2Level.equals("高級")) {
return -1;
} else if (a1Level.equals("初級") && a2Level.equals("中級")) {
return -1;
} else if (a1Level.equals("高級") && a2Level.equals("資深")) {
return -1;
} else if (a1Level.equals("高級") && a2Level.equals("中級")) {
return 1;
} else if (a1Level.equals("高級") && a2Level.equals("初級")) {
return 1;
}
return 0;
};
downSurgeTable.sort(comparator);
Collections.reverse(downSurgeTable); // 上面排序正好相反,用這個方法 downSurgeTable.reverse(); 沒有這個方法
Map map = new HashMap();
List<Map<String, Object>> collectKF = downSurgeTable.stream().filter((map1) -> map1.get("title").toString().indexOf("開發") != -1).collect(Collectors.toList());
List<Map<String, Object>> collectCS = downSurgeTable.stream().filter((map1) -> map1.get("title").toString().indexOf("測試") != -1).collect(Collectors.toList());
collectKF.addAll(collectCS); // List 合并
wordDataMap.put("parametersMap", parametersMap);
// wordDataMap.put("writeSycleOneTable", downSurgeTable); // 整體排序
wordDataMap.put("writeSycleOneTable", collectKF); // 先開發后測試
try {
// 讀取word模板
fileInputStream = new FileInputStream(file);
template = new WordTemplate(fileInputStream);
// 替換數據
template.replaceDocument(wordDataMap);
//生成文件
String outputFileName = outputPath + "writeSycleOneTable" + ".docx";
File outputFile = new File(outputFileName);
fos = new FileOutputStream(outputFile);
template.getDocument().write(fos);
} catch (Exception e) {
throw new RuntimeException(e);
}
try {
if (fileInputStream != null) {
fileInputStream.close();
}
if (fileInputStream != null) {
fileInputStream.close();
}
if (fos != null) {
fos.close();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
知識點
(1) comparator 不能少些, 一一對比只對比一次,因此需要把所有程序都寫全,否則 下一步 downSurgeTable.sort(comparator); 會報錯
資深 > 高級 > 中級 >初級
總共寫了12種對比情況
(1) 資深 高級
(2) 資深 中級
(3) 資深 初級
(4) 中級 高級
(5) 中級 資深
(6) 中級 初級
(7) 初級 資深
(8) 初級 高級
(9) 初級 中級
(10) 高級 資深
(11) 高級 中級
(12) 高級 初級
最終 自己和自己別沒寫對比,就是 return 0 即可
Comparator<Map<String, Object>> comparator = (a1, a2) -> {
String a1Level = (String) a1.get("itLevel");
String a2Level = (String) a2.get("itLevel");
if (a1Level.equals("資深") && a2Level.equals("高級")) {
return 1;
} else if (a1Level.equals("資深") && a2Level.equals("中級")) {
return 1;
} else if (a1Level.equals("資深") && a2Level.equals("初級")) {
return 1;
} else if (a1Level.equals("中級") && a2Level.equals("高級")) {
return -1;
} else if (a1Level.equals("中級") && a2Level.equals("資深")) {
return -1;
} else if (a1Level.equals("中級") && a2Level.equals("初級")) {
return 1;
} else if (a1Level.equals("初級") && a2Level.equals("資深")) {
return -1;
} else if (a1Level.equals("初級") && a2Level.equals("高級")) {
return -1;
} else if (a1Level.equals("初級") && a2Level.equals("中級")) {
return -1;
} else if (a1Level.equals("高級") && a2Level.equals("資深")) {
return -1;
} else if (a1Level.equals("高級") && a2Level.equals("中級")) {
return 1;
} else if (a1Level.equals("高級") && a2Level.equals("初級")) {
return 1;
}
return 0;
};
downSurgeTable.sort(comparator);
知識點2 : List 反向排序
List downSurgeTable;
Collections.reverse(downSurgeTable); // 發現結果排序正好相反,用這個方法
// 錯誤寫法 downSurgeTable.reverse(); 沒有這個方法, 報錯
知識點3 : List過濾
List<Map<String, Object>> collectKF = downSurgeTable.stream().filter((map1) -> map1.get("title").toString().indexOf("開發") != -1).collect(Collectors.toList());
List<Map<String, Object>> collectCS = downSurgeTable.stream().filter((map1) -> map1.get("title").toString().indexOf("測試") != -1).collect(Collectors.toList());
知識點4 : 2個List和并
collectKF.addAll(collectCS); // List 合并
浙公網安備 33010602011771號