总起:①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); } }