牛骨文教育服务平台(让学习变的简单)

1. Comparable

package java.lang;
import java.util.*;

public interface Comparable<T> {
    public int compareTo(T o);
}

说明:

Comparable 是排序接口。若一个类实现了Comparable接口,则该类可以支持排序。 假设现在存在实现Comparable接口的类的实例的List列表(或数组),则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。

假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。

举例:

package com.qunar.test;

/**
 * Created by xiaosi on 16-3-7.
 */
public class Student implements Comparable<Student>{

    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = 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 int compareTo(Student stu) {
        if(age == stu.getAge()){
            return name.compareTo(stu.getName());
        }//if
        else if(age > stu.getAge()){
            return 1;
        }
        return -1;
    }
}
        List<Student> stus = new ArrayList<Student>();
        stus.add(new Student("xiaosi",24));
        stus.add(new Student("sunny",24));
        stus.add(new Student("yoona",21));
        stus.add(new Student("kim",27));

        Collections.sort(stus);
        for(Student stu : stus){
            System.out.println("age" + stu.getAge() + "   name->" + stu.getName());
        }

以上实例实现的功能是:按student的age排序,如果年龄相同,则按name排序。

2. Comparator

package java.util;

public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

说明:

若一个类本身不支持排序,并且没有实现Comparable接口。那么我们可以建立一个该类的比较器来进行排序。这个比较器只需要实现Comparator接口即可。我们可以通过比较器,然后通过该比较器对类进行排序。

举例:

package com.qunar.test;

/**
 * Created by xiaosi on 16-3-7.
 */
public class Teacher {
    private String name;
    private int age;

    public Teacher(String name, int age) {
        this.name = name;
        this.age = 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;
    }
}

比较器:

package com.qunar.test;

import java.util.Comparator;

/**
 * Created by xiaosi on 16-3-7.
 * Teacher比较器
 */
public class TeacherComparator implements Comparator<Teacher>{

    @Override
    public int compare(Teacher o1, Teacher o2) {
        if(o1.getAge() == o2.getAge()){
            return o1.getName().compareTo(o2.getName());
        }//if
        else if(o1.getAge() > o2.getAge()){
            return 1;
        }
        return -1;
    }
}
        List<Teacher> teachers = new ArrayList<Teacher>();
        teachers.add(new Teacher("xiaosi",24));
        teachers.add(new Teacher("sunny",24));
        teachers.add(new Teacher("yoona",21));
        teachers.add(new Teacher("kim",27));
        Collections.sort(teachers,new TeacherComparator());
        for(Teacher te : teachers){
            System.out.println("age" + te.getAge() + "   name->" + te.getName());
        }

3. 比较

Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作)。 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。可以说一个是自己完成比较,一个是外部程序实现比较的差别而已。

用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。

Comparable使用:将比较方法写到实体类内对外声明所有比较规则统一按照这一种方式,代码的通用性差,如果改变一种比较规则,代码需要重写

Comparator使用:这种方式的比较实现了实体和比较规则的解绑,实现的比较规则可以根据自己的业务需求调用对应的比较类