介绍
一种是在自定义类内实现Comparable接口,并重写compareTo方法,在compareTo方法中自定义比较规则,另一种是在类外创建Comparator比较器,并重写compare方法,两种方法的代码如下:
1、类内定义比较规则
public class Person2 implements Comparable<Person2> {
@Override // 升序排列
public int compareTo(Person2 o) {
return this.getAge() - o.getAge();
}
Integer age;
String name;
public Person2(Integer age, String name) {
this.age = age;
this.name = name;
}
public Integer getAge() {
return age;
}
public String getName() {
return name;
}
}
测试代码如下:
public class 比较逻辑 {
public static void main(String[] args) {
List<Person2> person2List = new ArrayList<>();
person2List.add(new Person2(133, "tom"));
person2List.add(new Person2(24, "jack"));
person2List.add(new Person2(3, "tomdd"));
Collections.sort(person2List);
for (Person2 person2 : person2List) {
System.out.println(person2.getName() + "," + person2.getAge());
}
}
}
运行结果:
2、类外定义比较规则
自定义类如下:
public class Person {
Integer age;
String name;
public Person(Integer age, String name) {
this.age = age;
this.name = name;
}
public Integer getAge() {
return age;
}
public String getName() {
return name;
}
}
主函数及测试代码如下:
public static void main(String[] args) {
Comparator<Person> comparator = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
};
List<Person> persons = new ArrayList<>();
persons.add(new Person(133, "tom"));
persons.add(new Person(24, "jack"));
persons.add(new Person(3, "tomdd"));
Collections.sort(persons, comparator);
for (Person person : persons) {
System.out.println(person.getName() + "," + person.getAge());
}
}
测试结果:
两种比较方式的比较
(1)重写Comparator
接口的compare方法在类外定义,不需要修改类的任何内容,而重写Comparable接口的toCompare方法必须在类内定义,即使用 Comparator
可以避免修改类,有利于保持代码的封装性和分离性;
(2)可以在类外定义多个Comparator
比较方法,实现对同一类的多种比较方式,而在类内只能定义1种comparable方法。
因此Comparator
的灵活性更高,可以定义多种比较规则,且无需修改类的任何代码。