java中我们如何给对象排序?这就必须借助Comparator 或 Comparable。有了他们就意味着你可用实现对象之间的比较。也就可用做到排序了。
Comparable
Comparable 也被称为自然排序,只要实现了这个接口的类实例化出来的对象都可以称为 可比较对象 下面是Comparator 接口定义的方法:
public interface Comparable<T> { public int compareTo(T o); }
Comparable中只定义了一个comparaTo的方法接收一个泛型参数,返回int类型。比较规则如下:
- 返回整数 当前对象大于目标对象
- 返回0 当前对象等于目标对象
- 返回负数 当前对象小于目标对象
比如我们要给一个对象Person排序,那么就先实现Comparable接口,再调用集合排序的方法,那么就会按照我们定义的排序规则进行排序import java.util.ArrayList;
import java.util.Collections; import java.util.List; public class Person implements Comparable<Person>{ private int id; private String sname; private int age; public Person() {} public Person(int id, String sname, int age) { this.id = id; this.sname = sname; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(Person o) { // TODO Auto-generated method stub //比较规则:根据id比较 return this.id - o.id; } }
public static void main(String[] args) { List<Person> list = new ArrayList<>(); list.add(new Person(3, "d", 342)); list.add(new Person(1, "z", 1)); list.add(new Person(4, "z", 1)); list.add(new Person(5, "z", 1)); list.add(new Person(2, "z", 1)); //排序 Collections.sort(list); for (Person person : list) { System.out.println(person.getId()); } }
执行结果:
1 2 3 4 5
Collections会调用对象的compareTo方法进行比较,根据执行结果导出我的结论完全正确
Comparator
也被称为自定义排序。当我们的类没有实现Comparator或者compareTo定义的排序规则不符号我们当前的要求,比如我有的地方要根据id排序,有的地方要更具age排序。那么我们就可用借助Comparator来实现。Comparator定义了排序的规则
public interface Comparator<T> { int compare(T o1, T o2); }
非常简单
返回整数 o1 > o2
返回0 o1 == 02
返回负数 o1 < 02
还是上面那个例子,我们要实现根据年龄排序,但不能更改现有排序规则,那么就可以使用Comparator来定义排序规则
import java.util.Comparator; public class AgeSort implements Comparator<Person>{ @Override public int compare(Person o1, Person o2) { // TODO Auto-generated method stub return o1.getAge() - o2.getAge(); } }
public static void main(String[] args) { List<Person> list = new ArrayList<>(); list.add(new Person(3, "d", 4)); list.add(new Person(1, "z", 45)); list.add(new Person(4, "z", 1)); list.add(new Person(5, "z", 3)); list.add(new Person(2, "z", 2)); //指定规则排序(根据年龄) Collections.sort(list, new AgeSort()); for (Person person : list) { System.out.println("id" + person.getId() + ",age" + person.getAge()); } }
运行结果:
id4,age1 id2,age2 id5,age3 id3,age4 id1,age45
Comparable 和 Comparator的比较
1、Comparable一个类只能定义一个,而且一个规则只能用于一个类。Comparator可用将排序规则抽象成一个类。在排序的时候指定使用那个Comparator就可用了,Comparable更加灵活
2、实现Comparable比Comparator的耦合性要强,如果那一天需求变动要修改比较规则。那么就要修改Comparable的实现类,而Comparator因为是外部定义的所有不需要对排序类做如何修改,你可用修改Comparator实现类排序规则,或者保留原有的重新写一个Comparator都行.