问题场景

公司业务需求,从数据库中返回一个List对象,List中存储的map对象,要求对List进行排序。可以通过重写Comparator接口,实现对List的自定义排序。

问题描述

  • List中存储为map对象
  • Map中包含key值分别为"gradeName"、“className”
  • 实现对班级的有序排列

排序前数据:
小六(1)班、高三(5)班、高二(6)班、高三(2)班、高一(3)班、初三(4)班
初三(2)班、高二(2)班、初三(1)班、小三(3)班、小二(5)班、小六(2)班
小一(6)班、小一(1)班、小二(4)班、高三(3)班、初二(3)班、初三(3)班
小一(5)班、初二(2)班、高二(1)班、高二(4)班、高三(4)班、小二(3)班
小三(1)班、小四(5)班、小一(4)班、高一(5)班、小五(4)班、小五(6)班
小四(1)班、小三(6)班、小五(1)班、小一(3)班、小三(4)班、小五(5)班
小六(3)班、小六(5)班、高二(3)班、小一(2)班、小四(3)班、初三(6)班
小四(2)班、初一(2)班、高三(6)班、高一(2)班、小三(2)班、小二(2)班
小三(5)班、初一(5)班、小六(4)班、小二(6)班、高一(6)班、初二(6)班
初一(4)班、高一(1)班、初二(4)班、小四(4)班、小六(6)班、初二(1)班
初三(5)班、小二(1)班、小五(2)班、高二(5)班、初二(5)班、小四(6)班
初一(3)班、高一(4)班、高三(1)班、小五(3)班、初一(6)班、初一(1)班

排序后数据:
小一(1)班、小一(2)班、小一(3)班、小一(4)班、小一(5)班、小一(6)班
小二(1)班、小二(2)班、小二(3)班、小二(4)班、小二(5)班、小二(6)班
小三(1)班、小三(2)班、小三(3)班、小三(4)班、小三(5)班、小三(6)班
小四(1)班、小四(2)班、小四(3)班、小四(4)班、小四(5)班、小四(6)班
小五(1)班、小五(2)班、小五(3)班、小五(4)班、小五(5)班、小五(6)班
小六(1)班、小六(2)班、小六(3)班、小六(4)班、小六(5)班、小六(6)班
初一(1)班、初一(2)班、初一(3)班、初一(4)班、初一(5)班、初一(6)班
初二(1)班、初二(2)班、初二(3)班、初二(4)班、初二(5)班、初二(6)班
初三(1)班、初三(2)班、初三(3)班、初三(4)班、初三(5)班、初三(6)班
高一(1)班、高一(2)班、高一(3)班、高一(4)班、高一(5)班、高一(6)班
高二(1)班、高二(2)班、高二(3)班、高二(4)班、高二(5)班、高二(6)班
高三(1)班、高三(2)班、高三(3)班、高三(4)班、高三(5)班、高三(6)班

实现代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class compareSolution {
// 自定义排序器
public static final String[] gradeOrder =
{ "小学一", "小学二", "小学三", "小学四", "小学五", "小学六", "初中一", "初中二", "初中三", "高中一","高中二", "高中三" };// 将数组转化为List
public static final List<String> orderList = Arrays.asList(gradeOrder);//这里是重点,实现自定义排序
public static Comparator<Map<String, Object>> compare = new Comparator<Map<String, Object>>() {@Overridepublic int compare(Map<String, Object> map1, Map<String, Object> map2) {Integer index1 = orderList.indexOf(map1.get("gradeName"));Integer index2 = orderList.indexOf(map2.get("gradeName"));if (index1.equals(index2)) {// 正则表达式String regex = "(\\d+)";String className1 = map1.get("className").toString();String className2 = map2.get("className").toString();Pattern pattern = Pattern.compile(regex);Matcher match1 = pattern.matcher(className1);Matcher match2 = pattern.matcher(className2);Integer classIndex1 = 0;Integer classIndex2 = 0;if (match1.find() && match2.find()) {classIndex1 = Integer.parseInt(match1.group(1));classIndex2 = Integer.parseInt(match2.group(1));}return classIndex1.compareTo(classIndex2);}return index1.compareTo(index2);}
};public static void main(String[] args) {/* >>>>>>>>>>>>>>>>>>>构建数据集开始<<<<<<<<<<<<<<<<<<<<<<<<<< */List<Map<String, Object>> list = new ArrayList<>();for (String grade : gradeOrder) {for (int index = 6; index > 0; index--) {Map<String, Object> map = new HashMap<>();String gradeName = grade;String className = grade.substring(0, 1) + grade.substring(2, 3) + "(" + index + ")班";map.put("gradeName", gradeName);map.put("className", className);list.add(map);}}// 打乱顺序Collections.shuffle(list);/* >>>>>>>>>>>>>>>>>>>构建数据集结束<<<<<<<<<<<<<<<<<<<<<<<<<< */System.out.println(">>>>>>>>>>>>>>>>>>>排序前<<<<<<<<<<<<<<<<<<<<<<<<<<");list.forEach(schoolClass -> {System.out.println(schoolClass.get("className"));});// 对map进行排序Collections.sort(list,compare);System.out.println(">>>>>>>>>>>>>>>>>>>排序后<<<<<<<<<<<<<<<<<<<<<<<<<<");list.forEach(schoolClass -> {System.out.println(schoolClass.get("className"));});
}

}

后记

重点就是重写Comparator,实现自己自定义排序的逻辑。上述代码粘贴复制到编辑器中可以直接运行,供大家学习使用。

力学笃行系列之List自定义排序相关推荐

  1. VSTO之旅系列(三):自定义Excel UI

    VSTO之旅系列(三):自定义Excel UI 原文:VSTO之旅系列(三):自定义Excel UI 本专题概要 引言 自定义任务窗体(Task Pane) 自定义选项卡,即Ribbon 自定义上下文 ...

  2. spreadsheet js中创建下拉列表_JS 中创建自定义排序方法

    原文:https://www.youtube.com/watch?v=zVevl-K-m7Y 译者:前端小智 为了保证的可读性,本文采用意译而非直译. 想优质文章请猛戳GitHub博客,一年百来篇优质 ...

  3. android键盘还是讯飞输入,讯飞输入法BiuBiu键盘又添神仙操作 分类自定义排序来了...

    原标题:讯飞输入法BiuBiu键盘又添神仙操作 分类自定义排序来了 日前,讯飞输入法Android和iOS新版对BiuBiu键盘进行个性化升级,支持按自己喜好调节分类排序啦,它像一位懂你的A.I.助手 ...

  4. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  5. SpringDataJpA复杂查询实现自定义排序

    需求: 列表页面实现按合同状态自定义排序 private Specification<TblContractPre> whereClause(final TblContractPre en ...

  6. .NET/C#中对自定义对象集合进行自定义排序的方法

    一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car ...

  7. MapReduce编程实例之自定义排序

    任务描述: 给出一组数据,自定义排序的样式,第一列降序,相同时第二列升序 example Data: 2013 1 2013 5 2014 5 2014 8 2015 9 2015 4 Code: p ...

  8. R语言dplyr包arrage函数排序dataframe实战:单列排序、多列排序、自定义排序

    R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序.自定义排序 目录 R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序

  9. pandas dataframe中的列进行重新排序、倒排、正排、自定义排序详解及实践

    pandas dataframe中的列进行重新排序,pandas dataframe列重排.倒排.正排.自定义排序详解及实践 实施数据构建: import pandas as pd import nu ...

最新文章

  1. Android Service
  2. 袖口里的“超能力”:Facebook腕带式AR传感器,可隔空打字、操控界面,LeCun点赞...
  3. extern C的主要作用简单解释
  4. Dubbo 3.0 前瞻之对接 Kubernetes 原生服务
  5. java 云 代码_云端如何编写Java代码
  6. [BZOJ 3236] [Ahoi2013] 作业 [BZOJ 3809] 【莫队(+分块)】
  7. 因为计算机丢失user32.dll,无法启动程序,说是计算机丢失user32.dll
  8. Bailian2675 计算书费【求和】
  9. JS有哪几种传参方式?
  10. Android 的 Recovery 模式分析
  11. RDPWrap远程桌面的一次脱坑
  12. C语言三款游戏(贪吃蛇、推箱子、小鸟飞飞)(含gui)(含完整代码、粘贴即用)
  13. php私人云,PHP源码Cloudreve乐云网盘私人云盘源码 资源下载不限速功能
  14. 总结几款国内外在线的神级抠图工具
  15. python判断_python判断与或
  16. 2013/06 事情发生之后都会显得云淡风轻
  17. 你知不知道痛楚的滋味?
  18. html5输入框自动放大镜,html5输入框左边有一个放大镜图标,右边有按钮点击触发搜索...
  19. 使用GSM6315模块,采用http或者https协议与服务器通信笔记
  20. Install failed. Installation failed a href='rerun'Rerun/a

热门文章

  1. 寓言之政府和计划生育——写在30年后的又一次改革——上海自贸区的成立
  2. 六区哈卡服务器无限公会,六区哈卡LM54级小牧师很迷茫!(请高手指点)
  3. 如何调用通达信l2行情接口?
  4. 1074: 最小公倍数(2级) 两个正整数,计算这两个数的最小公倍数。
  5. 干货分享 | 万字讲解Kafka 从基础到高级(附图讲解)
  6. Unity读取json大文件卡顿
  7. 腾讯云-轻量应用服务器部署Springboot项目+后台持续运行
  8. 泛型模版类出现了LNK2019: 无法解析的外部符号错误
  9. 反病毒工具入门系列-楔子
  10. php curl获取腾讯视频教程,获取腾讯视频M3U8下载地址