Comparable:中文翻譯:可比較的 adj
自定義的對象通過實(shí)現(xiàn)Comparable接口,成為一個(gè)可比較的對象矾策,通過自定義Comparable中的CompareTo方法來實(shí)現(xiàn)不同方式的比較
public interface Comparable<T>{
int compareTo(T other);
}
如下厢破,通過實(shí)現(xiàn)Comparable接口,自定義ComparaTo方法扫皱,實(shí)現(xiàn)紅茶之間通過價(jià)格來比較足绅,從而使紅茶按照價(jià)格的高低排序。(a.compareTo(b), 如果a與b相等韩脑,則返回0氢妈,排序后a位于b之前,則返回負(fù)值段多,a位于b之后首量,則返回正值)
package site.yourdiary;
/**
* Created by star on 5/21/2017.
*/
public class RedTea implements Comparable<RedTea>{
private String name;
private int price;
public RedTea(String name, int price){
this.name = name;
this.price = price;
}
@Override
public int compareTo(RedTea redTea) {
if(this.price < redTea.price){
return -1;
}else if(this.price == redTea.price){
return 0;
}else{
return 1;
}
}
@Override
public String toString() {
return "name:" + name + " price:" + price ;
}
}
然而,使用Comparable接口定義排序顯然有局限性进苍。對于一個(gè)給定的類加缘,只能夠?qū)崿F(xiàn)接口一次。如果在一個(gè)集合中需要按照價(jià)格排序觉啊,在另一個(gè)集合中按照名字排序拣宏,該怎么辦呢?另外杠人,如果需要對一個(gè)類的對象進(jìn)行排序勋乾,而這個(gè)類的創(chuàng)建值又沒有費(fèi)心實(shí)現(xiàn)Comparable接口宋下,又該怎么辦呢?
在這種情況下辑莫,可以通過Comparator對象傳遞給其他對象学歧,告訴它使用不同的比較方法
Comparator:比較儀,比較器
public interface Comparator<T>{
int compare(T a, T b);
}
與compareTo方法一樣各吨,如果a位于b之前枝笨,則返回負(fù)值;如果a和b相等绅你,則返回0伺帘,否則返回正值。
定義了一個(gè)GreenTea類忌锯,該類沒有實(shí)現(xiàn)Comparable接口伪嫁,所以是無法比較的
package site.yourdiary;
/**
* Created by star on 5/21/2017.
*/
public class GreenTea {
private String name;
private int price;
public GreenTea(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;
}
@Override
public String toString() {
return "name:" + name + " price:" + price;
}
}
自定義一個(gè)比較器,實(shí)現(xiàn)GreenTea對象的比較偶垮,自定義Compare方法张咳,實(shí)現(xiàn)不同的比較方式
package site.yourdiary;
import java.util.Comparator;
/**
* Created by star on 5/21/2017.
*/
public class ItemComparator implements Comparator<GreenTea> {
@Override
public int compare(GreenTea o1, GreenTea o2) {
String nameo1 = o1.getName();
String name02 = o2.getName();
return nameo1.compareTo(name02);
}
}
以TreeSet為例,將比較器傳遞給TreeSet似舵,TreeSet就知道該如何比較GreenTea了
package site.yourdiary;
import java.util.Set;
import java.util.TreeSet;
/**
* Created by star on 5/21/2017.
*/
public class ItemTreeSet {
public static void main(String[] args) {
ItemComparator itemComparator = new ItemComparator();
Set<GreenTea> set = new TreeSet(itemComparator);
set.add(new GreenTea("GreenTea3", 5));
set.add(new GreenTea("GreenTea2", 4));
for(GreenTea c: set){
System.out.println(c);
}
}
}
TreeSet能實(shí)現(xiàn)有序排序脚猾,但是要求傳入的對象必須告訴它如何排序