Comparator 和 Comparable

Comparator 和 Comparable 相同点

Comparator 和 Comparable都是java的接口,并且是用来对自定义的class比较大小的。

对于自定义类如:public class Person{ String name; int age }.
  当我们有这么一个personList,里面包含了person1, person2, persion3……,我们用Collections.sort( personList )是得不到预期的结果的。这时肯定有人要问,那为什么可以排序一个字符串list呢,如:
StringList{“hello1” , “hello3” , “hello2”} Collections.sort( stringList )
能够得到正确的排序,那是因为String 这个对象已经帮我们实现了 Comparable接口 , 所以Person 如果想排序, 也要实现一个比较器。

Comparator 和 Comparable 的区别

Comparable
  对于Comparable接口来说,它往往是进行比较类需要实现的接口。
该比较器仅包含一个有compareTo()方法,只有一个参数,返回值为int。返回值大于0表示对象大于参数对象;小于0表示对象小于参数对象;等于0表示两者相等。

Comparable 实现在 Person类的内部:
public class Persion implements Comparable {…compareTo() 比较Person的大小…}
  因为已经实现了比较器,那么Person现在是一个可以比较大小的对象了,它的比较功能和String完全一样,可以随时随地的拿来比较大小,因为Person现在自身就是有大小之分的。Collections.sort(personList)可以得到正确的结果。

Comparator
  对于Comparator接口来说,它的实现者被称为比较器,它包含一个compare()方法,有两个参数,返回值与Comparable的compareTo()方法一样,不同之处是Comparator接口一般不会被集合元素类所实现,而是单独实现或者匿名内部类方式实现。

Comparator 实现在Person的外部,此时Person类的结构不需要有任何变化,如:
public class Person{ String name; int age }
  然后另外定义一个比较器类:
public PersonComparator implements Comparator {…compare() 比较Person的大小…}
  在PersonComparator里面实现了怎么比较两个Person的大小。 所以,用这种方法,当要对一个 personList进行排序的时候,除了要传递personList过去,还需要把PersonComparator传递过去,因为怎么比较Person的大小是在PersonComparator里面实现的,如:Collections.sort( personList , new PersonComparator() )

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);  
    }  
}  
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;  
    }  
}  
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;  
    }   
}  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Frank---7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值