如果一个类已经开发完成,但是在此类建立的初期并没有实现Comparable接口,此时是无法对该类进行排序操作的。为了解决这样的问题,Java定义了另一个比较器接口comparator接口。接口定义如下:
public interface Comparator<T>{
public int compare(to1,to2);
boolean equals(Object obj);
}
可以发现此类也存在一个compare方法,同样返回0 -1 1;
与之前不同的是,我们需要专门定义一个比价器规则类才能对数组进行排序。
我们来新建一个学生类,此类包含姓名和年龄两个字段,并且以年龄进行排序:
public class Student2 {
private String name;
private int age;
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 String toString() {
return "Student2{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object obj) {
if(this == obj){
return true;
}
if(!(obj instanceof Student2)){
return false;
}
Student2 stu = (Student2)obj;
if(stu.name.equals(this.getName())&& stu.age == this.age){
return true;
}else{
return false;
}
}
}
比较器规则类:
public class StudentComparator implements Comparator<Student2> {
@Override
public int compare(Student2 o1, Student2 o2) {
if(o1.equals(o2)){
return 0;
}else if(o1.getAge() <o2.getAge()){
return 1;
}else {
return -1;
}
}
}
测试:
@Test
public void test(){
Student2 stu[] = {new Student2("张三",24),
new Student2("李四",22),
new Student2("王五",19),
new Student2("赵七",20),
new Student2("孙八",43)};
Arrays.sort(stu,new StudentComparator());
for (Student2 s :stu){
System.out.println(s);
}
}
结果:
Student2{name=’孙八’, age=43}
Student2{name=’张三’, age=24}
Student2{name=’李四’, age=22}
Student2{name=’赵七’, age=20}
Student2{name=’王五’, age=19}
可以看到该对象已经按照年龄从大到小排列起来了。