Comparable:中文翻译:可比较的 adj
自定义的对象通过实现Comparable接口,成为一个可比较的对象,通过自定义Comparable中的CompareTo方法来实现不同方式的比较
public interface Comparable<T>{
int compareTo(T other);
}
如下,通过实现Comparable接口,自定义ComparaTo方法,实现红茶之间通过价格来比较,从而使红茶按照价格的高低排序。(a.compareTo(b), 如果a与b相等,则返回0,排序后a位于b之前,则返回负值,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接口定义排序显然有局限性。对于一个给定的类,只能够实现接口一次。如果在一个集合中需要按照价格排序,在另一个集合中按照名字排序,该怎么办呢?另外,如果需要对一个类的对象进行排序,而这个类的创建值又没有费心实现Comparable接口,又该怎么办呢?
在这种情况下,可以通过Comparator对象传递给其他对象,告诉它使用不同的比较方法
Comparator:比较仪,比较器
public interface Comparator<T>{
int compare(T a, T b);
}
与compareTo方法一样,如果a位于b之前,则返回负值;如果a和b相等,则返回0,否则返回正值。
定义了一个GreenTea类,该类没有实现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;
}
}
自定义一个比较器,实现GreenTea对象的比较,自定义Compare方法,实现不同的比较方式
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能实现有序排序,但是要求传入的对象必须告诉它如何排序