Comparable与Comparator对比

本文参考链接:https://blog.csdn.net/u010859650/article/details/85009595

1.介绍

1.1.Comparable(排序接口)

Comparable 是排序接口,内部有唯一实现方法:int compareTo(T o)

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

若一个类实现了Comparable接口,就意味着“该类支持排序”。
通过x.compareTo(y)来比较x和y的大小:

x < y  => 负数
x == y => 零
x > y  => 正数

1.2.Comparator(比较器接口)

Comparator 是比较器接口。我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。
int compare(T o1, T o2) 和上面的x.compareTo(y)类似。

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

Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

2.示例

定义类House

public class House implements Comparable<House> {
    protected double proportion;  // 房子面积
    protected double price;		  // 房子单价
	// 构造函数
    public House(double proportion, double price) {
        this.proportion = proportion;
        this.price = price;
    }
	/**
	 * 重写compareTo方法, 利用房子的面积来进行大小比较
	 **/
	@Override
    public int compareTo(House o) {
        if (this.proportion > o.proportion) { // 大于返回正数
        	return 1;
        } else if (this.proportion < o.proportion) { // 小于返回负数
        	return -1;
        }
        return 0; // 相等返回0
    }

    @Override
    public String toString() {
        return "面积为" + proportion + "\t价格为" + price;
    }
}

List<House> houses = new ArrayList();
House h1 = new House(95.0, 12000);
House h2 = new House(110.0, 12160);
House h3 = new House(80.0, 16300);
House h4 = new House(150.3, 10690);
houses.add(h1);
houses.add(h2);
houses.add(h3);
houses.add(h4);

2.1.调用实现Comparable的类

// 示例:可利用Collections来调用
Collections.sort(houses);

2.2.调用Comparator的比较方法

// 首先定义比较器
/**
 * 实现Compatator接口, 并重写compare方法, 根据单价倒序排序
 **/
static class ComparatorPrice implements Comparator<House> {
    @Override
    public int compare(House o1, House o2) {
        // 下述对比code可简化为
        // return Integer.compare(o2.price, o1.price);
        if (o1.price < o2.price) {
        	return 1;
        } else if (o1.price > o2.price) {
            return -1;
        }
        return 0;
    }
}

// 利用Collections调用比较器
Collections.sort(houses, new ComparatorPrice());

// 匿名类写法
Collections.sort(houses, new Comparator<House> {
	public int compare(House o1, House o2) {
		return Integer.compare(o2.price, o1.price);
	}
});

// lambda表达式写法
Collections.sort(houses, (h1, h2) -> Integer.compare(h2.price, h1.price));

使用Comparator.comparing比较的方法参见链接:https://my.oschina.net/xinxingegeya/blog/2046405

2.3.Collection与Collections的区别

Collection是集合类的上级接口,继承与他有关的接口主要有List和Set
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全等操作。

public static void main(String args[]) {   
       List list = new ArrayList(); // List是实现Collection接口
       double array[] = {112, 111, 23, 456, 231};   
       for (int i = 0; i < array.length; i++) {   
           list.add(new Double(array[i]));   
       }   
       Collections.sort(list);   //把list按从小到大排序
       for (int i = 0; i < array.length; i++) {   
           System.out.println(list.get(i));   
       }   
       // 结果:23.0 111.0 112.0 231.0 456.0   
 }   

集合框架中,Collections工具类支持两种排序方法:

Collections.sort(List<T> list); 
Collections.sort(List<T> list, Comparator<? super T> c); // note: 第2个参数支持lambda表达式

如果待排序的列表中是数字或者字符,可以直接使用Collections.sort(list);
当需要排序的集合或数组不是单纯的数字型时,需要自己定义排序规则,实现一个Comparator比较器。
Collections调用Collections.sort(list)方法,方法传递一个List集合,这里要求,List泛型里面装的元素必须实现Comparable接口此外,列表中的所有元素都必须是可相互比较的(也就是说,对于列表中的任何 e1 和 e2 元素,e1.compareTo(e2) 不得抛出 ClassCastException)。

你可能感兴趣的:(java,java,Comparable,comparator)