力学笃行系列之List自定义排序

问题场景

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值