java内部比较器、外部比较器实现

内部比较器:带比较类继承Comparable接口重写compareTo()方法;

Comparable

Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。compareTo方法的返回值是int,有三种情况:

1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数

2、比较者等于被比较者,那么返回0

3、比较者小于被比较者,那么返回负整数

外部比较器:新建一个继承comparator接口的比较器类,类中实现compare()方法。

Comparator

Comparator可以认为是是一个外比较器,个人认为有两种情况可以使用实现Comparator接口的方式:

1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较

2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式

Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种情况:

1、o1大于o2,返回正整数

2、o1等于o2,返回0

3、o1小于o3,返回负整数

//主测试类
package comparableTwo;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
public class TestMain {
 
    public static voidmain(String[] args) {
      
       List<Student>list = new ArrayList<Student>(10);
       list.add(newStudent(1,"a"));
       list.add(newStudent(4,"s"));
       list.add(newStudent(2,"c"));
       list.add(newStudent(5,"b"));
       Collections.sort(list);//内部比较器
       System.out.println(list);
       // TODO 自动生成的方法存根
       List<Teacher>t = new ArrayList<Teacher>(10);
       t.add(newTeacher(1,12));
       t.add(newTeacher(4,13));
       t.add(newTeacher(2,14));
       t.add(newTeacher(1,15));
       Teacher t1 = newTeacher(5,17);
       Teacher t2 = newTeacher(8,2);
       Collections.sort(t,newTeacherComparator());//外部比较器
       System.out.println(t);     
      
    }
 
}
 
//packagecomparableTwo;
 
class Student implements Comparable{
    int num;
    String name;
    public Student(int n,String nam){
       num = n;
       name = nam;
    }
   
    public StringtoString(){
       return "\r\tnum:" + num +"\r\t"+name+"\r";
    }
   
    public intcompareTo(Object o) {
       Student tmp = (Student) o;
       int result=tmp.num>num?1:(tmp.num == num?0:-1);
       if(result == 0){
           result = tmp.name.indexOf(0)>name.indexOf(0)?1:-1;
       }
       return result;
    }
   
}
public class Teacher {
    private int num;
    private double salary;
    public Teacher(int num, double salary){
       this.num = num;
       this.salary = salary;
    }
   
    public double getSalary(){
       return this.salary;
    }
    public StringtoString(){
       return "\r\tnum:"+num+"salary:"+salary+"\r";
    }
}
 
importjava.util.Comparator;
 
public classTeacherComparator implements Comparator {
 
    @Override
    public int compare(Object o1, Object o2) {
       // TODO自动生成的方法存根
       Teacher t1 = (Teacher)o1;
       Teacher t2 = (Teacher)o2;
       if(t1.getSalary()< t2.getSalary()){
           return 1;
       }
       else if(t1.getSalary()> t2.getSalary()){
           return -1;
       }
       return 0;
    }
 
}

运行结果:

[
num:5name:b

num:4name:s

num:2name:c

num:1name:a
]
[
num:1 salary:15.0

num:2 salary:14.0

num:4 salary:13.0

num:1 salary:12.0
]

想要按从大到小排时候objec1 <  object2 ,return 1;

    原文作者:国服第l帅
    原文地址: https://blog.csdn.net/wu020708/article/details/51171756
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞