Comparator接口----Java常用类库
前言
现在如果一个类已经开发完成,但是此类在建立时的初期并没有实现Comparable接口,此时肯定是无法进行对象排序操作的,所以为了解决这样的问题,Java又定义了另一个比较器的操作接口----Comparator。此接口定义在java.util包中。接口定义如下:
public interface Comparator<T>{
public int compare(To 1, To 2);
boolean equals(Object obj);
}
若要实现此接口,必须实现此接口中的两个方法。
案例演示
package chapter_eleven;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Objects;
class Student01{
private String name; //定义属性name、age
private int age;
public Student01(){} //定义无参的构造方法
public Student01(String name, int age) { //定义有参的构造方法
this.name = name;
this.age = age;
}
//setter和getter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if(this == o){ //首先判断两个对象是否相等
return true;
}
if(!(o instanceof Student01)){ //若Object类对象o是否为Student01类的对象,若不是,返回false
return false;
}
Student01 student01 = (Student01)o; //通过对象的向下转型,获取student01对象
if(student01.name.equals(this.name) && student01.age == age){ //若两个对象的name属性和age属性相同
return true; //返回true
}else{
return false; //否则返回false
}
}
@Override
public String toString() {
return "Student01{" +
"name='" + name + '\'' +
", age=" + age +
'}' + "\n";
}
}
//定义对某个类的专门比较器,用做对象数组的排序
class StudentComparator implements Comparator<Student01>{
@Override
public int compare(Student01 o1, Student01 o2) {
if(o1.equals(o2)){ //若两个对象相等,返回0
return 0;
}else if(o1.getAge() < o2.getAge()){ //若对象不相等,则根据年龄进行排序
return 1;
}else {
return -1;
}
}
}
public class ComparatorDemo01 {
public static void main(String[] args) {
Student01[] student01s = { //定义学生对象数组
new Student01("张三",20),
new Student01("李四",22),
new Student01("王五",20),
new Student01("赵六",20),
new Student01("孙七",22)
};
Arrays.sort(student01s,new StudentComparator()); //对学生对象数组进行排序
System.out.println(Arrays.toString(student01s)); //输出所有学生对象信息
}
}
运行结果
[Student01{name='孙七', age=22}
, Student01{name='李四', age=22}
, Student01{name='赵六', age=20}
, Student01{name='王五', age=20}
, Student01{name='张三', age=20}
]