问题场景
公司业务需求,从数据库中返回一个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>>() {
@Override
public 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,实现自己自定义排序的逻辑。上述代码粘贴复制到编辑器中可以直接运行,供大家学习使用。