在Java中Comparable和Comparator都是对集合进行排序的,都是通过返回-1、0、1来进行交换,但是两种方式有差别。
- Comparable:使用集合内部元素的排序方法(compareTo)进行排序,所以内部比较的元素要实现Comparable接口。
- Comparator:使用外部Comparator对象的(compare方法)排序方式,所以集合需要实现Comparator接口的对象。
例如我们又一个Person类,如果我们把该类的对象放入list集合当中,对象在集合中的顺序就是放入的顺序。
import java.util.ArrayList;
public class ComparableTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Person> list=new ArrayList<>();
list.add(new Person("a", 20));
list.add(new Person("b", 16));
list.add(new Person("c", 50));
for(int i=0;i<list.size();i++){
System.out.println("name:"+list.get(i).name+";age:"+list.get(i).age);
}
}
}
class Person{
String name;
int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
}
输出结果是:
name:a;age:20
name:b;age:16
name:c;age:50
但是如果我们想要person对象在集合中的顺序是按年龄排序的了,这时候我们就需要对集合进行排序了。可以使用Collections.sort方法。使用Collections.sort有两种方式:
- sort(List list),直接传入集合对象,但需要集合的内部元素有实现Comparable,它采用的内部类的compareTo方法进行比较。
- sort(List list, Comparator< super T> c) ,该方法不仅需要传入排序的集合,还有实现Comparator接口的对象,它采用Comparator对象的compare进行比较。
1.使用内部元素的排序方法,需要实现Compareble。
package execise;
import java.util.ArrayList;
import java.util.Collections;
public class ComparableTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Person> list=new ArrayList<>();
list.add(new Person("a", 20));
list.add(new Person("b", 16));
list.add(new Person("c", 50));
Collections.sort(list);
for(int i=0;i<list.size();i++){
System.out.println("name:"+list.get(i).name+";age:"+list.get(i).age);
}
}
}
class Person implements Comparable<Person>{
String name;
int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
@Override
public int compareTo(Person p) {
// TODO Auto-generated method stub
if(age==p.age)
return 0;
else if(age>p.age)
return 1;
else
return -1;
}
}
运行结果:
name:b;age:16
name:a;age:20
name:c;age:50
2.使用Comparator对象。
package execise;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class ComparableTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Person> list=new ArrayList<>();
list.add(new Person("a", 20));
list.add(new Person("b", 16));
list.add(new Person("c", 50));
Collections.sort(list, new Comparator<Person>(){
@Override
public int compare(Person p1, Person p2) {
// TODO Auto-generated method stub
if(p1.age==p2.age)
return 0;
else if(p1.age>p2.age)
return 1;
else
return -1;
}
});
for(int i=0;i<list.size();i++){
System.out.println("name:"+list.get(i).name+";age:"+list.get(i).age);
}
}
}
class Person {
String name;
int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
}
运行结果:
name:b;age:16
name:a;age:20
name:c;age:50
3.总结
两种方式采用Comparator更好一些,因为Comparable代码侵入太高,比较部分和类的逻辑耦合在一起,如果要改变排序方法就必须修改类的代码;而Comparator的耦合低。