Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法 被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现 此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中 的键或有序集合中的元素,无需指定比较器。
Comparator:强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或 有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。
创建一个Person类,存储到ArrayList集合中完成指定排序操作。代码如下:
//一个简单的Person类
class Person{
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person(\"" + name + "\", " + age + ")";
}
}
public class SortDemo {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<Person>();
list.add(new Person("zhangsan", 20));
list.add(new Person("lisi", 23));
list.add(new Person("wangwu", 17));
list.add(new Person("xiaoming", 19));
//按照年龄排序 升序
//Collections.sort(list); //直接这样写会报错,要求该list类型必须实现比较器Comparable接口
for(Person p : list) {
System.out.println(p.toString());
}
}
}
发现,当我们调用Collections.sort()方法的时候,程序会报错。 原因:如果想要集合中的元素完成排序,那么必须要实现比较器Comparable接口。 所以我们就完成了Person类的一个实现,代码修改如下:
class Person implements Comparable<Person>{
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person(\"" + name + "\", " + age + ")";
}
@Override
public int compareTo(Person o) {
return this.age - o.age; //按照年龄升序
}
}
当Person类实现了Comparable接口之后,再执行Collections.sort(list); 语句就不会报错了。
输出结果:
Person("wangwu", 17)
Person("xiaoming", 19)
Person("zhangsan", 20)
Person("lisi", 23)
但是,上述方法只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。如果在使用的时候,想要多次定义类的排序规则,那么可以考虑使用独立的定义规则,采用Collections.sort(List list,Comparetor c)方式来自己定义规则,代码如下:
class Person2{
String name;
int age;
public Person2(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person(\"" + name + "\", " + age + ")";
}
}
public class SortDemo2 {
public static void main(String[] args) {
ArrayList<Person2> list = new ArrayList<Person2>();
list.add(new Person2("zhangsan", 20));
list.add(new Person2("lisi", 23));
list.add(new Person2("wangwu", 17));
list.add(new Person2("xiaoming", 19));
list.add(new Person2("lihua", 19));
//按照年龄排序 升序
Collections.sort(list, new Comparator<Person2>(){
@Override
public int compare(Person2 o1, Person2 o2) {
return o1.age - o2.age; //按照年龄升序
}
});
for(Person2 p : list) {
System.out.println(p.toString());
}
System.out.println();
//如果想要规则更多一些,可以参考下面代码
Collections.sort(list, new Comparator<Person2>(){
@Override
public int compare(Person2 o1, Person2 o2) {
int result = o1.age - o2.age; //按照年龄升序
if(result == 0) { //若年龄相等,则按照姓名的首字母升序
result = o1.name.charAt(0) - o2.name.charAt(0);
}
return result;
}
});
for(Person2 p : list) {
System.out.println(p.toString());
}
}
}
输出结果:
Person("wangwu", 17)
Person("xiaoming", 19)
Person("lihua", 19)
Person("zhangsan", 20)
Person("lisi", 23)Person("wangwu", 17)
Person("lihua", 19)
Person("xiaoming", 19)
Person("zhangsan", 20)
Person("lisi", 23)