Comparable接口和Comparator接口

Comparable和Comparator接口简介

Comparable接口和Comparator接口的作用 : 用于给实现类规范比较(排序)的方法.

首先看两个接口的代码:

Comparable接口

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

Comparator接口

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
    //其他默认方法和静态方法;
    //......
}

比较两个接口的代码,我们可以看到:

  1.Comparable的compareTo(T)方法只有1个参数,.

  2.Comparator接口的compare(T o1, T o2)方法有两个参数, 有@FunctionalInterface接口,所以有Lambda表达式的用法

所以,

  Comparable只能在类内部实现比较功能,让想让实现比较功能的类自身实现Comparable接口

  Comparator可以做成比较器类,让比较器类实现Comparator接口

Comparator接口为什么有多个抽象方法还被标注为函数式接口?

  compare(T o1, T o2)方法外的另一个抽象方法equals(Object obj)是Object类的方法,因此所有类都有该方法,不影响Comparator作为函数式接口(瞎猜的).

  *接口并非继承自Object,只是接口定义了一套与Object完全相同的方法(详细内容可以网上查询一下,这里暂不讨论)

如何让类实现比较功能?

让该类实现Comparable接口,并重写接口内的compareTo(T o)方法,示例如下

public Person implaments Comparable{
    private int id;
    private String name;
    //......构造函数及get/set方法省略
    
    @Override
    public int compareTo(Person p) {
        int result = this.id-p.getId();
        if(result<0) return -1;
        if(result > 0) return 1;
        return 0;
    }
}    

  这样,该Person类就具备了比较的功能,当要给ArrayList<Person> list排序的时候,就可以调用Collections.sort(List T)方法,来实现对集合list的排序.

如果类没有实现比较功能,怎么给装有该类的List集合排序?

  答案是: 使用比较器(Comparator)

有两种使用方法: 

一.调用Collections.sort(List T, Comparator<? super T> c)重载方法,传入list和比较器对象实现排序

Collections.sort(list1, new Comparator<String>() {
	@Override
	public int compare(String o1, String o2) {
		int a = Integer.parseInt(o1);
		int b = Integer.parseInt(o2);
		if (a>b) return 1;
		if (a<b) return -1;
		return 0;
	}
});

  

二.使用List的sort(Comparator<? super T> c)方法,传入比较器对象来排序

list1.sort(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        int a = Integer.parseInt(o1);
        int b = Integer.parseInt(o2);
        if (a>b) return 1;
        if (a<b) return -1;
        return 0;
    }
)

  因为Comparator接口是函数式接口,所以List的sort()方法和Collections的sort()方法,都可以用Lambda表达式的写法.

  

Collections.sort(list1, (a,b) -> {
  //......省略
  return 0;
});
list1.sort((a, b) -> {
  //......省略
  return 0;
});

  

fff

posted @ 2019-04-23 22:52  Kaneha  阅读(1146)  评论(0编辑  收藏  举报