Java中的Collections.sort()

本文详细介绍了如何在Java中使用Collections对整数列表进行排序,以及如何通过实现Comparable接口对对象(如Student类)按单字段和多字段进行排序,包括升序和降序操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.码仙励志

时间是治疗心灵创伤的大师,但绝不是解决问题的高手。

1.普通数字排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ListSortTest {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		list.add(3);
		list.add(2);
		list.add(2);
		list.add(4);
		list.add(1);
		System.out.println(list);
		// 从小到大排序
		Collections.sort(list);
		System.out.println(list);
		// 倒序
		Collections.reverse(list);
		System.out.println(list);
	}
}

运行结果:

[3, 2, 2, 4, 1]
[1, 2, 2, 3, 4]
[4, 3, 2, 2, 1]

2.对象单字段排序

先创建一个对象Student,我们用age来排序

public class Student {

	private String name;
	private int age;
	private int height;

	public Student(String name, int age, int height) {
		super();
		this.name = name;
		this.age = age;
		this.height = height;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", height=" + height + "]";
	}
	
}

开始排序:
这里说一下重写的 public int compareTo(Student o){} 这个方法,它返回三种 int 类型的值:负整数,零 ,正整数。

  1. 负整数:当前对象的值 < 比较对象的值 , 位置排在前。
  2. 零:当前对象的值 = 比较对象的值 , 位置不变。
  3. 正整数:当前对象的值 > 比较对象的值 , 位置排在后。

让Student实现 Comparable 接口,然后重写里面的
compareTo()方法。

public class Student implements Comparable<Student> {

	private String name;
	private int age;
	private int height;

	public Student(String name, int age, int height) {
		super();
		this.name = name;
		this.age = age;
		this.height = height;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", height=" + height + "]";
	}

	@Override
	public int compareTo(Student o) {
		// 从大到小
		// return o.age - this.age;
		// 从小到大
		return this.age - o.age;
	}
	
}

测试一下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ListSortTest {
	public static void main(String[] args) {
		List<Student> list = new ArrayList<Student>();

		list.add(new Student("喜羊羊", 25, 175));
		list.add(new Student("美羊羊", 18, 165));
		list.add(new Student("懒羊羊", 23, 170));
		list.add(new Student("沸羊羊", 23, 175));
		list.add(new Student("慢羊羊", 80, 169));

		System.out.println("默认:");
		for (Student student : list) {
			System.out.println(student);
		}

		System.out.println("排序:");
		Collections.sort(list);
		for (Student student : list) {
			System.out.println(student);
		}

		System.out.println("倒序:");
		Collections.reverse(list);
		for (Student student : list) {
			System.out.println(student);
		}
	}
}

运行结果:

默认:
Student [name=喜羊羊, age=25, height=175]
Student [name=美羊羊, age=18, height=165]
Student [name=懒羊羊, age=23, height=170]
Student [name=沸羊羊, age=23, height=175]
Student [name=慢羊羊, age=80, height=169]
排序:
Student [name=美羊羊, age=18, height=165]
Student [name=懒羊羊, age=23, height=170]
Student [name=沸羊羊, age=23, height=175]
Student [name=喜羊羊, age=25, height=175]
Student [name=慢羊羊, age=80, height=169]
倒序:
Student [name=慢羊羊, age=80, height=169]
Student [name=喜羊羊, age=25, height=175]
Student [name=沸羊羊, age=23, height=175]
Student [name=懒羊羊, age=23, height=170]
Student [name=美羊羊, age=18, height=165]

3.对象多字段排序

接下来根据age和height排序
把Student的compareTo重写一下

public class Student implements Comparable<Student> {

	private String name;
	private int age;
	private int height;

	public Student(String name, int age, int height) {
		super();
		this.name = name;
		this.age = age;
		this.height = height;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", height=" + height + "]";
	}

	@Override
	public int compareTo(Student o) {
		// 从大到小
		if (o.age == this.age) {
			return o.height - this.height;
		}
		return o.age - this.age;
	}

}

ListSortTest不用变
运行结果:

默认:
Student [name=喜羊羊, age=25, height=175]
Student [name=美羊羊, age=18, height=165]
Student [name=懒羊羊, age=23, height=170]
Student [name=沸羊羊, age=23, height=175]
Student [name=慢羊羊, age=80, height=169]
排序:
Student [name=慢羊羊, age=80, height=169]
Student [name=喜羊羊, age=25, height=175]
Student [name=沸羊羊, age=23, height=175]
Student [name=懒羊羊, age=23, height=170]
Student [name=美羊羊, age=18, height=165]
倒序:
Student [name=美羊羊, age=18, height=165]
Student [name=懒羊羊, age=23, height=170]
Student [name=沸羊羊, age=23, height=175]
Student [name=喜羊羊, age=25, height=175]
Student [name=慢羊羊, age=80, height=169]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值