Comparable接口和Comparator接口

Comparable和Comparator接口简介

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

首先看两个接口的代码:ide

Comparable接口函数

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

Comparator接口this

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

比较两个接口的代码,咱们能够看到:spa

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

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

因此,blog

  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

相关文章
相关标签/搜索