关于Comparator 和 Comparable比较器正确的理解:比较器是(小→大)排列的,为什么能得到(大→小)的排列结果

    xiaoxiao2025-05-02  13

    1、Comparator 和 Comparable 的区别

    Comparator 和 Comparable都是java的接口,用来比较自定义的class

    Comparator(外部比较器)

    覆写compare()方法

    Pserson类: public class Person{} 定义一个比较器类: public PersonComparator implements Comparator {} 把要排列的Person保存在List类集或数组当中当中 Pserson[] arr={pserson1,new pserson2,new pserson3}; List list=new ArrayList(); list.add(pserson1); list.add(pserson2); list.add(pserson3); 调用sort方法有两种方式: Collections.sort( list, new PersonComparator() ) Array.sort(arr, new PersonComparator()) 此时list或arr中的元素已经排列完成,直接输出arr或list即可 Comparable(内部比较器)

    覆写compareTo()方法

     

    Comparable 实现在 Person类的内部: 调用sort,这里的参数只有一个 Collections.sort(List)

    2、对比较器实现原理的理解

     

    比较器的解释

    compare()方法和compareTo()方法的返回值都为int,有三种

    >0: 当前对象大于参数对象;

    <0: 当前对象小于参数对象;

    =0: 两者相等;

     

    分析:由大到小的排列规则

    如:假设x为当前对象,y为参数对象

    if(x>y){ return -1; }else if(x<y){ return 1; }else{ return 0; }

     

     

     

    当x=3,y=5

    将得到返回值1,表示x>y,即x=大 而 y=小

    排列结果(小→大)即y,x=5,3

    当x=5,y=3

    将得到返回值-1,表示x<y,即x=小 而 x=大

    排列结果(小→大)即x,y=5,3

     

    分析由小到大的排列规则

    如:假设x为当前对象,y为参数对象

    if(x>y){ return 1; }else if(x<y){ return -1; }else{ return 0; }

     

     

    当x=3,y=5

    将得到返回值-1,表示x<y,即x=小 而 x=大

    排列结果(小→大)即x,y=3,5

    当x=5,y=3

    将得到返回值1,表示x>y,即x=大 而 y=小

    排列结果(小→大)即y,x=3,5

     

    比较两种规则 由小到大的排列规则 if(x>y){ return 1; }else if(x<y){ return -1; }else{ return 0; } 由大到小的排列规则 if(x>y){ return -1; }else if(x<y){ return 1; }else{ return 0; }

    3、演示

    主方法 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class CompareTest { public static void main(String[] args) { List<Student> list = new ArrayList<Student>(10); list.add(new Student(1,"jj")); list.add(new Student(0,"ww")); list.add(new Student(0,"kk")); list.add(new Student(2,"ll")); Collections.sort(list); // 内部比较器:要排序的类实现Comparable接口,可以对自身进行比较 System.out.println(list); List<Teacher> t = new ArrayList<Teacher>(10); t.add(new Teacher(1,12)); t.add(new Teacher(0,13)); t.add(new Teacher(0,14)); t.add(new Teacher(2,15)); Collections.sort(t,new StudentComparator()); //外部比较器:通过额外的类来实现Comparator接口 System.out.println(t); } } Comparable class Student implements Comparable { int num; String name; public Student(int num, String name) { this.num = num; this.name = name; } @Override public String toString() { return "\r\tnum:"+num+" name:"+name+"\r"; } public int compareTo(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; } } Comparator class Teacher{ int num; double salary; public Teacher(int num, double salary) { this.num = num; this.salary = salary; } @Override public String toString() { return "\r\tnum:"+num+" salary:"+salary+"\r"; } } class StudentComparator implements Comparator{ public int compare(Object o1, Object o2) { Teacher t1 = (Teacher) o1; Teacher t2 = (Teacher) o2; int result = t1.num > t2.num ? 1 : (t1.num == t2.num ? 0 : -1); return result = result == 0 ?(t1.salary<t2.salary ? 1 : -1) : result; } }

     

     

    最新回复(0)