在最近的开发中,需要对一些数据对象按照某一规则进行排序的操作,由于对象实例一般都是存放在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接口:基础类通过实现接口方法设定既定排序,扩展性差,与基础类耦合度太高
- 欢迎加入微信公众号