Comparable接口实现排序
public interface Comparable<T>
Comparable是对实现了该接口的类的所有对象进行排序
举个栗子
class Person implements Comparable<Person> {
private String name;
private int age;
@Override
public int compareTo(Person o) {
//这里是对Person类的对象间年龄进行比较,升序
return this.getAge() - o.getAge();
}
……
}
测试代码
public class Test {
public static void main(String[] args) {
TreeSet<Person> persons = new TreeSet<Person>() {
{
add(new Person("张三", 11));
add(new Person("李四", 8));
add(new Person("王五", 18));
}
};
System.out.println(persons);
}
}
输出结果
[Person{name='李四', age=8}, Person{name='张三', age=11}, Person{name='王五', age=18}]
Comparator接口实现排序
public interface Comparator<T>
对任意类型集合对象进行整体排序,排序时将此接口的实现传递给Collections.sort方法或者Arrays.sort方法排序。
实现int compare(T o1, T o2);方法,返回正数,零,负数各代表大于,等于,小于。
举个栗子
List<Person> personList = new ArrayList<Person>() {
{
add(new Person("张三", 11));
add(new Person("李四", 8));
add(new Person("王五", 18));
}
};
//按年龄进行排序
Collections.sort(personList, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
//升序
return o1.getAge() - o2.getAge();
//降序
// return o2.getAge() - o1.getAge();
}
});
System.out.println(personList);
或者也可以通过实现的方式使用Comparator接口
class Person implements Comparator<Person> {
private String name;
private int age;
@Override
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
……
}
Comparable接口和Comparator接口的区别
- Comparable接口位于java.lang包下;Comparator位于java.util包下
- Comparable接口只提供了一个compareTo()方法;Comparator接口不仅提供了compara()方法,还提供了其他默认方法,如reversed()、thenComparing(),使我们可以按照更多的方式进行排序
- 如果要用Comparable接口,则必须实现这个接口,并重写comparaTo()方法;但是Comparator接口可以在类外部使用,通过将该接口的一个匿名类对象当做参数传递给Collections.sort()方法或者Arrays.sort()方法实现排序。Comparator体现了一种策略模式,即可以不用要把比较方法嵌入到类中,而是可以单独在类外部使用,这样我们就可有不用改变类本身的代码而实现对类对象进行排序。