Java集合排序二:Comparable接口;compareTo()方法;Comparator接口和Comparable接口比较;
1.Comparable接口
Comparable接口:
(1)java.lang包下的接口;
(2)Comparable接口只有一个方法:int compareTo(T o)方法;
如: obj1.compareTo(obj2):obj1小于、等于、大于obj2时,分别返回负整数、零、正整数。
(3)一个集合中的元素是某个自定类型,如果要多其排序,那么这个自定义类需要实现Comparable接口,并且按照业务需求,实现Comparable接口的compareTo(T o)方法。
(4)对于集合,其中的元素的类实现了Comparable接口的话,可以调用Collections.sort()方法完成集合的排序;
即如果是对集合中的自定义数据排序的话,使用Collections.sort()方法;
如果是对数组中的自定义数据进行排序的话,使用Arrays.sort()方法;
……………………………………………………
示例:按照价格从小到大正序排列:
Goods类:集合中存储的元素为Goods类对象;Goods类需要实现Comparable接口,并根据实际业务需要,实现Comparable接口的compareTo()方法;
GoodsTest类:测试类;
/**
* (1)集合中存放Goods类型的对象,那么Goods类就要实现Comparable接口
* @author Administrator
*
*/
public class Goods implements Comparable<Goods> {
private String id;
private String name;
private double price;
public Goods(){}
public Goods(String id,String name,double price){
this.id = id;
this.name = name;
this.price = price;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString(){
return "编号:"+id+"名称:"+name+"价格:"+price;
}
// 根据业务要求,实现Comparable接口中的compareTo()方法
@Override
public int compareTo(Goods arg0) {
double price1 = this.getPrice();
double price2 = arg0.getPrice();
double diff = price1 - price2;// 根据价格升序排列
if(diff >0){
return 1;
}else if(diff == 0){
return 0;
}else{
return -1;
}
}
}
public class GoodsTest {
public static void main(String[] args) {
Goods g1 = new Goods("s0001","手机",2000);
Goods g2 = new Goods("s0002","冰箱",5000);
Goods g3 = new Goods("s0003","电视机",3000);
ArrayList<Goods> list = new ArrayList<Goods>();
list.add(g1);
list.add(g2);
list.add(g3);
System.out.println("排序前:");
for(Goods good:list){
System.out.println(good);
}
Collections.sort(list); // 调用方法进行集合排序
System.out.println("排序后:");
for(Goods good:list){
System.out.println(good);
}
}
}
注:此时调用的sort()方法是一个参数的那个
2.compareTo()方法
可以看到,在使用Comparable接口的时候,接口的实现类实现了compareTo()方法;即这个方法是Comparable接口的compareTo()方法;
其实,对于基本数据类型的包装类,字符串类也都有compareTo()方法。
(1)基本数据类型包装类的compareTo()方法就是比较大小的:
……………………………………………………
(2)String类的compareTo()方法,是挨个比较字符串中每个字符的Unicode值;全相等就返回0;挨个比较后,遇到小于的了就返回负数,遇到大的了就返回整数。
3.Comparator接口和Comparable接口比较
这儿都是重复阐述,看一下就行
具体在实际应用那种,选择哪种,或二者如何结合使用,需要慢慢积累。