区别比较
Comparable | Comparator |
---|---|
排序接口 | 比较器接口 |
该类支持排序,如果类的对象是List列表(或数组),可以通过Collection.sort(或Array.sort)进行排序 | 该类本身不支持排序(没有实现Comparable的接口),需要建立一个该类的比较器,这个比较器实现Comparator接口 |
相当于内部比较器 | 相当于外部比较器 |
仅包含一个函数:x.compareTo(y) | 仅包含两个函数:compareTo(x,y);【equals(Object obj);(可以不实现)】 |
Comparable
public class Person implements Comparable<Person> {
int age;
String name;
double score;
Person(int age, String name,double score) {
this.age = age;
this.name = name;
this.score=score;
}
@Override
public int compareTo(Person person) {//排序
int flag1=this.age-person.age;
if(flag1!=0) {//先根据年龄进行排序
return flag1;
}else {
int flag2=this.name.compareTo(person.name);//再根据姓名
if(flag2!=0) {
return flag2;
}else {
return (int)(this.score-person.score);//最后根据分数
}
}
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + ", score=" + score + "]";
}
}
public class Test {
public static void main(String[] args) {
ArrayList<Person> p = new ArrayList<Person>();
p.add(new Person(20, "aaa",60));
p.add(new Person(17, "ccc",100));
p.add(new Person(17, "ccc",30));
p.add(new Person(17, "ddd",80));
p.add(new Person(21, "eee",90));
p.add(new Person(30, "fff",90));
System.out.println(p);
/* [Person [age=20, name=aaa, score=60.0], //输出本身不换行,考虑到视觉效果,在此进行换行
Person [age=17, name=ccc, score=100.0],
Person [age=17, name=ccc, score=30.0],
Person [age=17, name=ddd, score=80.0],
Person [age=21, name=eee, score=90.0],
Person [age=30, name=fff, score=90.0]] */
System.out.println("根据年龄、姓名、成绩排序后:");
Collections.sort(p);//对象为AarrayList,因此可以用Collections进行排序
System.out.println(p);
/* 根据年龄、姓名、成绩排序后:
[Person [age=17, name=ccc, score=30.0],
Person [age=17, name=ccc, score=100.0],
Person [age=17, name=ddd, score=80.0],
Person [age=20, name=aaa, score=60.0],
Person [age=21, name=eee, score=90.0],
Person [age=30, name=fff, score=90.0]] */
}
}
Comparator
- 新建一个类
public class Teacher {
String name;
int age;
Teacher(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Teacher [name=" + name + ", age=" + age + "]";
}
}
- 创建该类的比较器
public class AgeComparator implements Comparator<Teacher> {
@Override
public int compare(Teacher teacher1, Teacher teacher2) {//比较器定义
return teacher1.age-teacher2.age;
}
}
public class Test {
public static void main(String[] args) {
ArrayList<Teacher> p = new ArrayList<Teacher>();
p.add(new Teacher("zzz",22));
p.add(new Teacher("bbb",66));
p.add(new Teacher("ccc",33));
p.add(new Teacher("ddd",55));
p.add(new Teacher("eee",44));
System.out.println(p);
/* [Teacher [name=zzz, age=22],
Teacher [name=bbb, age=66],
Teacher [name=ccc, age=33],
Teacher [name=ddd, age=55],
Teacher [name=eee, age=44]] */
Collections.sort(p,new AgeComparator());//用比较器进行排序
System.out.println("根据年龄排序后:");
System.out.println(p);
/*根据年龄排序后:
[Teacher [name=zzz, age=22],
Teacher [name=ccc, age=33],
Teacher [name=eee, age=44],
Teacher [name=ddd, age=55],
Teacher [name=bbb, age=66]] */
}
}
(部分知识点来源:脚本之家)