黑马程序员——java基础笔记:比较器Comparator和Comparable

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

比较器概述:

  1. 如果一个数组里放的是一组对象,那么就会有怎么把这些对象进行排序的问题,往容器TreeSet里面添加对象时,必须要求这些对象时能够进行比较的,这里也会有对象的排序问题。我们在对对象进行排序的时候,就会用到比较器。常用的比较器有两种,Comparable和Comparator。
    Comparable和Comparator都是接口。一组对象要想进行排序,该对象所属的类就必须实现两个接口。一般来说,我们首选Comparable方法,具体的比较方法如下。

  2. 用Comparable比较器实现排序
    首先,创建一组需要比较的对象的类,并让该类实现Comparable接口,以Employee类为例:

public class Employee implements Comparable{
    private String name;
    private int age;
    public Employee(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Employee [name=" + name + ", age=" + age  +  "]";
    }
        @Override
    public int compareTo(Object o) {
        if(o instanceof Employee){
            Employee e = (Employee) o;
            return this.getAge() - e.getAge();
        }
        return 0;
        }
}
  1. 这个类创建好后,可以再创建一个TreeSet容器,也可以是数组,这里就以TreeSet容器为例,来进行对象的排序。代码如下:
public class testTree {
    public static void main(String[] args) {
    testTreeSet();
    }
    public static void testTreeSet(){
        Employee e1 = new Employee("liudehua",20);  //创建Employee对象
        Employee e2 = new Employee("zhangxueyou",22);
        Employee e3 = new Employee("liming",26);
        Employee e4 = new Employee("chenxujie",29);
        Employee e5 = new Employee("zhangsan",25);
        TreeSet ts = new TreeSet(); //创建一个TreeSet容器
        ts.add(e1);     //往容器里添加对象
        ts.add(e2);
        ts.add(e3);
        ts.add(e4);
        ts.add(e5);
        Iterator it = ts.iterator();    //创建一个迭代器来遍历对象
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

程序运行后可以得到如下结果,按年龄进行了排序:
Employee [name=liudehua, age=20]
Employee [name=zhangxueyou, age=22]
Employee [name=zhangsan, age=25]
Employee [name=liming, age=26]
Employee [name=chenxujie, age=29]

Comparable比较器一般用在一个类提前实现了该接口的情况下使用,现在有个问题是,我在设计一个类的时候没考虑到将来要对该类的对象进行排序,一段时间之后,要对这一组对象进行排序,这个时候再去修改Employee类就不合适了,这个时候,就可以用到Comparator比较器了。使用如下:

public class Employee {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Employee [name=" + name + ", age=" + age  +  "]";
    }
    public Employee(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
}
public class testTree {
    public static void main(String[] args) {
    testTreeSet();
    }
    public static void testTreeSet(){
        Employee e1 = new Employee("liudehua",20);  //创建Employee对象
        Employee e2 = new Employee("zhangxueyou",22);
        Employee e3 = new Employee("liming",26);
        Employee e4 = new Employee("chenxujie",29);
        Employee e5 = new Employee("zhangsan",25);
        EmployeeComparator ec = new EmployeeComparator();   //创建一个比较器ec,
        TreeSet ts = new TreeSet(ec);   //创建一个TreeSet容器,并往里传入比较器ec,
        ts.add(e1);     //往容器里添加对象
        ts.add(e2);
        ts.add(e3);
        ts.add(e4);
        ts.add(e5);
        Iterator it = ts.iterator();    //创建一个迭代器来遍历对象
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}
class EmployeeComparator implements Comparator{
    @Override
    public int compare(Object o1, Object o2) {
        if(o1 instanceof Employee && o2 instanceof Employee){
            Employee e1 = (Employee) o1;
            Employee e2 = (Employee) o2;
             int i =  e1.getAge() - e2.getAge();
             if(i == 0){
                 return e1.getName().compareTo(e2.getName());
             }
             return i;
        }
        return 0;
    }   
}

运行程序后,将得到如下结果:
Employee [name=liudehua, age=20]
Employee [name=zhangxueyou, age=22]
Employee [name=zhangsan, age=25]
Employee [name=liming, age=26]
Employee [name=chenxujie, age=29]

以上两种方式就是对对象进行排序的方法,一般来说,我们首选Comparable比较器,但如果遇到第二种情况,就选择第二种方法。可以根据自己的需要来选择使用以上两种方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值