從java內建類和自定義類比較Comparable介面和Comparator介面實現排序的不同

wangdongli_1993發表於2018-06-14

Comaparable介面

---內建類

1.  常見的內部類有String,Integer,Date都是實現了java.lang包下的Comparable介面,重寫其中的compareTo()方法。

例如:String類中重寫compareTo()方法首先按照取兩個字串的公共長度進行挨個比較,按照字元順序返回比較結果,若公共長度下兩個字串一樣,則返回長度差

比較結果:

整數:大於

負數:小於

0:相等

2,那麼對於Arrays類的sort方法(對於陣列的排序)和Collections的sorts方法(對於容器的排序),就取決於陣列和容器中的元素型別來呼叫各自類的compareTo()方法,實現排序。

 

---自定義類

那麼對於自定義的排序我們同樣實現了java lang包下的Comparable介面,重寫其中的compareTo()方法。

比如對於一些新聞條目進行時間,標題,點選量的排序,我們就可以自己實現

import java.text.SimpleDateFormat;
import java.util.Date;
public class NewsItem implements Comparable<NewsItem>{
private String title;
private int hits;
private Date pubTime;
public NewsItem(){

}
public NewsItem(String title, int hits, Date pubTime) {
super();
this.title = title;
this.hits = hits;
this.pubTime = pubTime.;
}

/*加上setter和getter方法*/

      @Override
public int compareTo(NewsItem o) {                 //重寫compareTo方法,實現自己的比較規則
int result=0;
//時間降序,分別呼叫各自型別的comapreTo()方法
result=-this.pubTime.compareTo(o.pubTime);  在sort排序是預設是升序,我們要降序所以在前面加負號

if(result==0){

result=this.hits-o.hits;    //點選量升序
if(result==0){
result=-this.title.compareTo(o.title);  //標題降序
}
}
return result;

}

/**為了後面方面我們重寫toString方法

*注意在列印的時候,系統會自動呼叫toString()方法

*/

@Override
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("標題:").append(this.title);
sb.append(" 點選量是:").append(this.hits);

sb.append(“日期是”).

                append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.pubTime)).

                sb.append(" 點選量是:").append(this.hits).append('\n');

return sb.toString();
}

}

那後續對內容是NewsItem的陣列或是列表,我們在呼叫sort()方法時,就會按照我們自己定義的排序規則進行排序。

Comparator介面

---內建類

首先Comparator是位於java.util下的介面,我們可以稱之為比較類

那比如有一個問題,當你想只通過字串的長度比較兩個字串,那你呼叫String類自己的compareTo()方法顯然是做不到的,這個時候我們就可以藉助Comparator介面,實現介面中的compare方法。如下:

public class StringComp implements Comparator<String>{
/**
* 按照長度比較
*/
@Override
public int compare(String o1, String o2) {
int len1=o1.length();
int len2=o2.length();
return len1-len2;
}
}

那比如我們有一個字串列表

List<String> list=new ArrayList();
list.add("adc");
list.add("a");
list.add("abcd");
list.add("adesc");
list.add("de");

我們通過Collections.sort(list,new StringComp())就可以實現按照長度對字串進行排序

 

---自定義類

如上所述,我們的自定義類都有自己的比較規則,那比如淘寶貨物我們會點積按照價格排序,或者按照收藏排序也就是排序規則是獨立的,這個時候我們用Comparable介面是實現不了的,解決方法是為每個排序規則實現比較類。

首先我們定義貨物類:

//不實現任何介面的類
public class Goods {
//商品名稱
private String name;
//商品價格
private double price;
//銷量
private int fav;
public Goods(String name, double price, int fav) {
super();
this.name = name;
this.price = price;
this.fav = fav;
}
/*加上構造方法和setter,getter方法*/
@Override
public String toString() {
return "Goods name=" + name + ", price=" + price + ", fav=" + fav+"\n";
}

}

那我們先為價格的排序規則實現業務類實現Comparator類,重寫compare方法:

//按照價格排序:降序
public class GoodsPriceComp implements java.util.Comparator<Goods>{
@Override
public int compare(Goods o1, Goods o2) {
// TODO Auto-generated method stub
return -(o1.getPrice()-o2.getPrice()>0?1:(o1.getPrice()-o2.getPrice()<0?-1:0));
}

}

使用:

public class GoodsApp {
public static void main(String args[]){
List<Goods> goods =new ArrayList();
goods.add(new Goods("短袖",100,2000));
goods.add(new Goods("大衣",400,158));
goods.add(new Goods("短褲",150,1000));
Collections.sort(goods, new GoodsPriceComp());
System.out.print(goods);

}

}

結果:

[Goods name=大衣, price=400.0, fav=158
, Goods name=短褲, price=150.0, fav=1000
, Goods name=短袖, price=100.0, fav=2000
]

那同理我們也可以為商品名稱和銷量各自實現排序類,這樣與實體類分開,也可以方便修改排序規則,各個排序規則也清楚明白。

 

相關文章