從java內建類和自定義類比較Comparable介面和Comparator介面實現排序的不同
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
]
那同理我們也可以為商品名稱和銷量各自實現排序類,這樣與實體類分開,也可以方便修改排序規則,各個排序規則也清楚明白。
相關文章
- JAVA中的Comparable介面和自定義比較器Java
- Java 中 Comparable 和 Comparator 比較Java
- Java Comparable 和 Comparator 介面詳解Java
- 比較器-Comparable和Comparator
- 抽象類 & 介面比較抽象
- Java 集合排序策略介面 ComparatorJava排序
- Java基礎系列-Comparable和ComparatorJava
- 字串排序 (java comparator介面的使用)字串排序Java
- java中抽象類和介面Java抽象
- Comparable和Comparator的區別
- JAVA Comparator 自定義排序 原始碼分析Java排序原始碼
- Java 的抽象類, 介面以及內部類Java抽象
- 閒說: Java 中Comparable 和 Comparator 的區別Java
- 類和類之間的比較
- Java集合框架中的介面和類Java框架
- Java抽象類和介面 小白版Java抽象
- Java基礎-抽象類和介面Java抽象
- 結合實戰理解 Java 抽象類和介面Java抽象
- 抽象類和介面抽象
- java介面和抽象類的簡單理解Java抽象
- MVC下的DAO介面類和SERVICE介面類區別?MVC
- delphi 判斷類是否實現介面,獲取類實現的介面
- Java抽象類、繼承及多型和介面卡的實現Java抽象繼承多型
- python 介面實現類的Python
- 【JAVA】自定義類載入器實現類隔離Java
- java-介面和抽象類的聯絡和區別。Java抽象
- 介面和抽象類 (abstract)抽象
- TypeScript 類實現介面TypeScript
- JAVA--set介面及其實現類的使用Java
- 類定義介面
- 介面的定義和實現
- JAVA基礎之三-介面和抽象類Java抽象
- Java 入坑 Kotlin 必看 —— 類、物件和介面JavaKotlin物件
- Java中抽象類和介面的區別Java抽象
- 介面和抽象類的區別抽象
- 自定義實現Complex類
- JAVA 將介面的引用指向實現類的物件Java物件
- Java的抽象類 & 介面Java抽象