Java中的Collections.sort()使用

在最近的开发中,需要对一些数据对象按照某一规则进行排序的操作,由于对象实例一般都是存放在List、Map等集合中,自然想到使用Collections类中的sort方法来对既定集合进行排序。下面通过Person类按照年龄age属性的排序来说明Collections.sort的一般使用方法

1、基础的Person类

  • Person类
public class Person {
	
	private int age;
	private String name;
	
	public Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}

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

2、一般的输出

  • 不进行排序的List集合
@Test
public void testCollection()
{
    List<Person> personList = new ArrayList<Person>();
    personList.add(new Person("张三",25));
    personList.add(new Person("王五",24));
    personList.add(new Person("李四", 30));
    System.out.println(personList);
}

输出结果: [Person [age=25, name=张三], Person [age=24, name=王五], Person [age=30, name=李四]]

结果很显然,List集合中的对象是无序对象。

3、增加Comparable接口的Person类并进行排序

  • 使用Collections.sort()进行排序

在上述测试函数中,增加Collections.sort(personList);编译器会告知Person需要实现Comparable接口

@Test
public void testCollection()
{
    List<Person> personList = new ArrayList<Person>();
    personList.add(new Person("张三",25));
    personList.add(new Person("王五",24));
    personList.add(new Person("李四", 30));
    Collections.sort(personList);
    System.out.println(personList);
}
  • 为Person类实现Comparable接口,并实现Comparable接口的compareTo方法
public class Person implements Comparable<Person>{
	
	private int age;
	private String name;
    
    public int getAge() {
		return age;
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}

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

	public int compareTo(Person o) {
		
		if (this.age>o.age)
		  return 1;
		else if (this.age == o.age)
		  return 0;
		else
			return -1;
	}

}
  • compareTo方法的返回值
返回值含义排序结果
正整数当前参与排序的值 > 比较对象参与排序的值当前对象排在后
当前参与排序的值 = 比较对象参与排序的值当前对象位置不变
负整数当前参与排序的值 < 比较对象参与排序的值当前对象排在前
  • 输出结果

[Person [age=24, name=王五], Person [age=25, name=张三], Person [age=30, name=李四]]

4、无法改变源文件的类如何进行排序

有些情况,在使用第三方jar包时或者给定类不希望增加接口时,如何通过进行排序?Colletions类中也提供了另外一种方式来进行排序,即通过Comparator来实现。

  • Comparator实现
@Test
public void testCollection()
{
    List<Person> personList = new ArrayList<Person>();
    personList.add(new Person("张三",25));
    personList.add(new Person("王五",24));
    personList.add(new Person("李四", 30));
    Collections.sort(personList,new Comparator<Person>() {
        public int compare(Person o1, Person o2) {
            if(o1.getAge()>o2.getAge())
                return 1;
            else if (o1.getAge() == o2.getAge())
                return 0;
            else 
                return -1;
        }

    });
    System.out.println(personList);
}
  • 输出结果

[Person [age=24, name=王五], Person [age=25, name=张三], Person [age=30, name=李四]]

5、comparator 以及 comparable的区别

  • comparator:基础类(Person类)不需要进行修改,符合POJO风格,比较方法由排序者自行定义,便于扩展
  • comparable接口:基础类通过实现接口方法设定既定排序,扩展性差,与基础类耦合度太高
  • 欢迎加入微信公众号
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值