1. Comparable
package java.lang;
import java.util.*;
public interface Comparable {
public int compareTo(T o);
}
說明:
Comparable 是排序接口。若一個類實現了Comparable接口,則該類可以支持排序。 假設現在存在實現Comparable接口的類的實例的List列表(或數組),則該List列表(或數組)可以通過Collections.sort(或 Arrays.sort)進行排序。
假設我們通過 x.compareTo(y) 來“比較x和y的大小”。若返回“負數”,意味著“x比y小”;返回“零”,意味著“x等於y”;返回“正數”,意味著“x大於y”。
舉例:
package com.qunar.test;
/**
* Created by xiaosi on 16-3-7.
*/
public class Student implements Comparable{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student stu) {
if(age == stu.getAge()){
return name.compareTo(stu.getName());
}//if
else if(age > stu.getAge()){
return 1;
}
return -1;
}
}
List stus = new ArrayList();
stus.add(new Student("xiaosi",24));
stus.add(new Student("sunny",24));
stus.add(new Student("yoona",21));
stus.add(new Student("kim",27));
Collections.sort(stus);
for(Student stu : stus){
System.out.println("age" + stu.getAge() + " name->" + stu.getName());
}
以上實例實現的功能是:按student的age排序,如果年齡相同,則按name排序。
2. Comparator
package java.util;
public interface Comparator {
int compare(T o1, T o2);
boolean equals(Object obj);
}
說明:
若一個類本身不支持排序,並且沒有實現Comparable接口。那麼我們可以建立一個該類的比較器來進行排序。這個比較器只需要實現Comparator接口即可。我們可以通過比較器,然後通過該比較器對類進行排序。
舉例:
package com.qunar.test;
/**
* Created by xiaosi on 16-3-7.
*/
public class Teacher {
private String name;
private int age;
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
比較器:
package com.qunar.test;
import java.util.Comparator;
/**
* Created by xiaosi on 16-3-7.
* Teacher比較器
*/
public class TeacherComparator implements Comparator{
@Override
public int compare(Teacher o1, Teacher o2) {
if(o1.getAge() == o2.getAge()){
return o1.getName().compareTo(o2.getName());
}//if
else if(o1.getAge() > o2.getAge()){
return 1;
}
return -1;
}
}
List teachers = new ArrayList();
teachers.add(new Teacher("xiaosi",24));
teachers.add(new Teacher("sunny",24));
teachers.add(new Teacher("yoona",21));
teachers.add(new Teacher("kim",27));
Collections.sort(teachers,new TeacherComparator());
for(Teacher te : teachers){
System.out.println("age" + te.getAge() + " name->" + te.getName());
}
3. 比較
Comparable是一個對象本身就已經支持自比較所需要實現的接口(如 String、Integer 自己就可以完成比較大小操作)。Comparator是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足你的要求時,你可以寫一個比較器來完成兩個對象之間大小的比較。可以說一個是自己完成比較,一個是外部程序實現比較的差別而已。
用 Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行為。比如:你想對整數采用絕對值大小來排序,Integer 是不符合要求的,你不需要去修改 Integer 類(實際上你也不能這麼做)去改變它的排序行為,只要使用一個實現了 Comparator 接口的對象來實現控制它的排序就行了。
Comparable使用:將比較方法寫到實體類內對外聲明所有比較規則統一按照這一種方式,代碼的通用性差,如果改變一種比較規則,代碼需要重寫
Comparator使用:這種方式的比較實現了實體和比較規則的解綁,實現的比較規則可以根據自己的業務需求調用對應的比較類