Java 中 List 集合排序方法

方式一: 调用List接口自己的sort方法排序

java 复制代码
public static void main(String[] args)  {
        List<Integer> numList=new ArrayList<>();
        numList.add(999);
        numList.add(123);
        numList.add(456);
        numList.add(66);
        numList.add(9);
 
        Collections.sort(numList);  //使用Collections类的方法排序
 
        numList.sort(new Comparator<Integer>() {//使用List接口的方法排序
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        });
       
        //lambda表达式实现List接口sort方法排序
        numList.sort((num1,num2)->{return num1.compareTo(num2);});
 
        System.out.println(numList);
    }

方式二:使用java.util.Collections类的sort(List list)方法

java 复制代码
 
public static void main(String[] args)  {
	List<User> numList=new ArrayList<>();
	User u=new User();
	u.setAge(12);
	numList.add(u);
 
	User u1=new User();
	u1.setAge(34);
	numList.add(u1);
 
	User u2=new User();
	u2.setAge(6);
	numList.add(u2);
 
	User u3=new User();
	u3.setAge(99);
	numList.add(u3);
 
	//Collections类的sort方法对对象集合排序,要传集合和Comparator接口两个参数
	Collections.sort(numList, new Comparator<User>() {
		@Override
		public int compare(User o1, User o2) {
			Integer age1= o1.getAge();
			Integer age2= o2.getAge();
			return  age1.compareTo(age2);
		}
	});
	//List接口自身的sort方法对对象集合排序,重写Comparator接口方法即可
	numList.sort(new Comparator<User>() {
		@Override
		public int compare(User u1, User u2) {
			Integer age1= u1.getAge();
			Integer age2= u2.getAge();
			return  age1.compareTo(age2);
		}
	});
	
	//List接口的sort方法,lambda表达式写法
   numList.sort((u4,u5)->{
		Integer age1= u4.getAge();
		Integer age2= u5.getAge();
		return  age1.compareTo(age2);
	});
	System.out.println(numList);
}

注:Collections的sort方法其实是调用了List接口自己的sort方法。

方式三:使用Stream流的sort方法

  1. 首先你需要list.parallelStream().sorted 进行流处理,使用parallelStream可以充分调度多核CPU。
  2. 使用Comparator.comparing进行排序,reversed()进行倒序排列,thenComparing进行下一个排序。
  3. Comparator.comparing()里面的内容,也是就是Object::getter,例如KeywordCounterDTO::getKeyword
  4. 最后格式化为需要的格式 List 是.collect(Collectors.toList()) , Map是.collect(Collectors.toMap(KeywordCounterDTO::getKey, KeywordCounterDTO::getValue))

1. 单字段排序

java 复制代码
根据年龄倒序排
 
public static void main(String[] args)  {
	List<User> numList=new ArrayList<>();
	User u=new User();
	u.setAge(12);
	numList.add(u);
 
	User u1=new User();
	u1.setAge(34);
	numList.add(u1);
 
	User u2=new User();
	u2.setAge(6);
	numList.add(u2);
 
	User u3=new User();
	u3.setAge(99);
	numList.add(u3);
 
	numList = numList.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
}

2. 多字段排序

java 复制代码
先对学生的班级做排序,然后同班级做倒序
public static void main(String[] args)  {
	List<User> numList=new ArrayList<>();
	User u=new User();
	u.setClass(1);
	u.setAge(12);
	numList.add(u);
 
	User u1=new User();
	u.setClass(1);
	u1.setAge(34);
	numList.add(u1);
 
	User u2=new User();
	u.setClass(2);
	u2.setAge(6);
	numList.add(u2);
 
	User u3=new User();
	u.setClass(2);
	u3.setAge(99);
	numList.add(u3);
 
	numList = numList.parallelStream().sorted(
	  Comparator.comparing(User::getClass).reversed().thenComparing(User::getAge)
	).collect(Collectors.toList());
}

3. nullsFirst 排序

当集合中存在null元素时,可以使用针对null友好的比较器,null元素排在集合的最前面

java 复制代码
public static void main(String[] args)  {
	List<User> numList=new ArrayList<>();
	User u=new User();
	u.setClass(1);
	u.setAge(12);
	numList.add(u);
 
	User u1=new User();
	u.setClass(1);
	u1.setAge(34);
	numList.add(u1);
 
	User u2=new User();
	u.setClass(2);
	u2.setAge(6);
	numList.add(u2);
 
	User u3=new User();
	u.setClass(2);
	u3.setAge(99);
	numList.add(u3);
	
	numList = numList.parallelStream().sorted(
	  Comparator.nullsFirst(User::getClass).reversed().thenComparing(User::getAge)
	).collect(Collectors.toList());
}
相关推荐
苍何6 分钟前
一手实测 Claude Fable 5,手搓了个 Obsidian 的 Codex 插件
后端
zfoo-framework10 分钟前
[修改代码使用]codex官方app中使用中转(不需要cc-switch) 1.config.toml 2.sk方式登录
java
逍遥德30 分钟前
MQTT教程详解-05.SpringBoot集成mqtt client 性能分析
java·spring boot·spring·mt
云烟成雨TD34 分钟前
Spring AI 1.x 系列【54】Retry 机制分析
java·人工智能·spring
weixin_5231853237 分钟前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端
点燃大海38 分钟前
SpringAI构建智能体
java·spring boot·spring·springai智能体
xier_ran40 分钟前
【infra之路】02_RadixAttention与KV_Cache管理
java·spring boot·spring
swipe1 小时前
做多轮对话 Agent,为什么我建议把短期记忆放到 Redis
后端·面试·llm
黑马师兄1 小时前
RAG混合检索深度解析:让AI真正找到你要的内容
java·人工智能·ai·agent·rag·ai-native
码客日记1 小时前
Spring Boot 配置文件敏感信息加密(Jasypt 企业级完整方案)
java·spring boot·git