总起:①Comparable和Comparator接口都是用来比较大小的。
② 从小到大:当前的(从第二个数开始)依次减去链表头结点的值直到当前的前一个为止
从大到小:链表头结点的值直到当前的前一个依次减到当前的(从第二个数开始)为止。
(this)
return 返回负数,交换
返回正数,不交换
返回0,相等,不交换
一、Comparable接口介绍
1、定义:
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
2、通过Comparable接口实现整体排序的步骤:
(1)需要排序对象的类先实现Comparable接口。
(2)实现Comparable接口中的compareTo()方法。
注意:可以使用Collection.sort()方法给List列表排序,Arrays.sort()给数组排序。
例:
public class Book implements Comparable<Book>{
private String name;
private int price;
public Book(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
/**
* 从小到大:当前的(从第二个数开始)依次减去链表头结点的值直到当前的前一个为止
* 从大到小:、链表头结点的值直到当前的前一个依次减到当前的(从第二个数开始)为止。、
* (this)
* return 返回负数,交换
* 返回正数,不交换
* 返回0,相等,不交换
*/
@Override
public int compareTo(Book o) {
//从大到小
//int i=-this.price+o.price;
//从小到大
int i=this.price-o.price;
System.out.println("price "+this.price+" "+i);
return i;
}
@Override
public String toString() {
return "Book [name=" + name + ", price=" + price + "]";
}
}
二、Comparator接口介绍-------需排序类无法修改,使用Comparator接口(策略模式)
1、定义:
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
2、public static <T> void sort(List<T> list, Comparator<? super T> c)采用内部类的实现方式,重写compare()方法,该方式使用了策略模式,对排序的算法进行抽取抽取成一个排序算法类,然后委托给Collections类---调用--->List类的sort()方法-----调用---->Arrays类中的sort()方法进行处理
3、例子:
public class SortTest {
public static void main(String[]args) {
Book book1=new Book("你好啊",12);
Book book2=new Book("我好啊",13);
Book book3=new Book("他好啊",10);
Book book4=new Book("它好啊",100);
ArrayList<Book>list=new ArrayList<>();
list.add(book1);
list.add(book2);
list.add(book3);
list.add(book4);
//Collections.sort(list);
Collections.sort(list, new Comparator<Book>() {
@Override
public int compare(Book o1, Book o2) {
if(o1==null||o2==null) {
return 0;
}else {
//从小到大
return o1.getPrice()-o2.getPrice();
}
}
});
System.out.println(list);
}
}