本文参考链接:https://blog.csdn.net/u010859650/article/details/85009595
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 => 正数
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相当于“外部比较器”。
定义类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);
// 示例:可利用Collections来调用
Collections.sort(houses);
// 首先定义比较器
/**
* 实现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
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)。