實現Comparable介面和Comparator介面,並重寫compareTo方法和compare方法
實體類:java.lang.Comparable(介面) + comareTo(重寫方法),業務排序類 java.util.Comparator(介面) + compare(重寫方法).
這兩個介面我們非常的熟悉,但是 在用的時候會有一些不知道怎麼下手的感覺,現在用案例進行總結,消除對這個知識點的理解盲區(個人的理解,如果有錯誤 請多多指教)。
一,在實際的需求中,我們需要根據物件的各種屬性(標題,時間,點選率,銷售額...)進行排序(升序,降序),可以在資料庫的sql上進行處理,但是 不是每一個場景 都適合在sql上進行處理,我們有時候需要在程式根據不同的屬性,對一個物件進行各種排序 通過頁面呈現給使用者。
下面有這樣的一個需求,一種商品(商品名,銷售量,生產日期),根據生產日期降序 銷售量升序 商品名稱降序
思路:首先按照日期降序,如果日期相同 按照銷售量升序,如果銷售量相同,按周商品的名稱降序
1,建立需要比較的物件的java bean
建立 Bean的快捷鍵:
1),帶引數的構造器:// Shift + Alt + S -->O
2),不帶引數的構造器: //Alt + / 生成空的構造方法
3),生成 get set方法:// Shift + Alt + S --> R + Table + Enter + Shift +Table -->Enter
/**
* 商品po類
*/
public class Items implements java.lang.Comparable<Items > {
private String title;
private int hits;
private Date pubTime;
public Items() {}
public Items(String title, int hits, Date pubTime) {
super();
this.title = title;
this.hits = hits;
this.pubTime = pubTime;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getHits() {
return hits;
}
public void setHits(int hits) {
this.hits = hits;
}
public Date getPubTime() {
return pubTime;
}
public void setPubTime(Date pubTime) {
this.pubTime = pubTime;
}
//時間降序 點選量升序 標題降序
@Override
public int compareTo(Items o) {
int result = 0;
//按照生產時間降序
result = - this.pubTime.compareTo(o.pubTime);
if(0==result){//如果生產時間相同 就按照銷售量升序排列
result = this.hits-o.hits;
if(0==result){//如果銷售量相同 按照名字降序排列
result = - this.title.compareTo(o.title);
}
}
return result;
}
@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)).append("\n");
return sb.toString();
}
}
2,造資料,比較
//時間降序, 銷售量升序, 標題降序
public static void main(String[] args) {
List<Items> item
= new ArrayList<Items>();
item.add(new Items("abcitems"
,30,new Date(System.currentTimeMillis()-1000*60*60)));
item.add(new Items("abcfgitems"
,30,new Date(System.currentTimeMillis()-1000*60*50)));
item.add(new Items("abcditems"
,100,new Date()));
item.add(new Items("abefNews"
,50,new Date(System.currentTimeMillis()-1000*60*60)));
System.out.println("----------排序前----------");
System.out.println(item);
System.out.println("----------排序後----------");
Collections.sort(item);
System.out.println(item);
}
二,Comparator的應用場景
一般比較字串是按照unicode的大小進行排序的,但是我需要按照字串的長度進行排序,下面是實現的案例:
首先,定義比較的業務規則
/**
* 定義業務的比較規則,我需要按照字串的長度進行比較(在實際的場景中,可以根據業務的需求,靈活的改變比較規則,實現排序)
*/
public class CompareString implements java.util.Comparator<String> {
@Override
public int compare(String o1, String o2) {
int len1 = o1.length();
int len2 = o2.length();
return -(len1-len2);//需要按照降序排列
}
}
比較 字串的長度,按照 降序排列
public static void main(String[] args) {
List<String> list
= new ArrayList<String>();
list.add("abc");
list.add("abcd");
list.add("ab");
list.add("abd");
Collections.sort(list,new CompareString());
System.out.println(list);
//[abcd, abc, abd, ab]
}
比如 商品,我需要按照價格的降序排列,程式碼如下:
商品 po類
/**
* 商品po類
*/
public class Products {
private String title;
private int price;
public Products() {}
public Products(String title, int price) {
super();
this.title = title;
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "title=" + title+",price=" + price +"\n";
}
}
定義比較規則:
/**
* 按照價格的降序排列
*/
public class ProductCompare implements java.util.Comparator<Products> {
@Override
public int compare(Products o1, Products o2) {
return -( o1.getPrice()-o2.getPrice()>0?1: (o1.getPrice()==o2.getPrice()?0:-1));
}
}
資料比較:
public static void main(String[] args) {
List<Products> product
= new ArrayList<Products>();
product.add(new Products("a",120));
product.add(new Products("b",143432));
product.add(new Products("c",1892));
product.add(new Products("d",11092));
Collections.sort(product,new ProductCompare());
System.out.println(product);
結果:
[title=b,price=143432
title=d,price=11092
title=c,price=1892
title=a,price=120
]
}
相關推薦
【java】實現Comparable介面和Comparator介面,並重寫compareTo方法和compare方法
實現Comparable介面和Comparator介面,並重寫compareTo方法和compare方法 2016年08月11日 14:39:25 蘇尹 閱讀數:10772更多 個人分類: 學習筆記 實體類:java.lang.Comparable(介面) + coma
實現Comparable介面和Comparator介面,並重寫compareTo方法和compare方法
實體類:java.lang.Comparable(介面) + comareTo(重寫方法),業務排序類 java.util.Comparator(介面) + compare(重寫方法). 這兩個介面我們非常的熟悉,但是 在用的時候會有一些不知道怎麼下手的感覺,現在用案例
Java中實現物件的比較:Comparable介面和Comparator介面
在實際應用中,我們往往有需要比較兩個自定義物件大小的地方。而這些自定義物件的比較,就不像簡單的整型資料那麼簡單,它們往往包含有許多的屬性,我們一般都是根據這些屬性對自定義物件進行比較的。所以Java中要比較物件的大小或者要對物件的集合進行排序,需要通過比較這些物件的某些屬性
Java中實現Comparable介面和Comparator介面的排序演算法效率比較
在PAT Basic Level的真題中,有”德才論“這麼一題(點選可開啟題目)。 最開始我是構造了一個學生類,存放學生資訊,實現Comparator介面,遺憾的是,後臺測試時,每一個測試用例皆顯示程式執行超時。 public class Main ... class S
Comparable和Comparator介面比較
Java提供了只包含一個compareTo()方法的Comparable介面。這個方法可以個給兩個物件排序。具體來說,它返回負數,0,正數來表明已經存在的物件小於,等於,大於輸入物件。 Java提供了包含compare()和equals()兩個方法的Comparator介面。compare()方
實現匿名內部類Comparator介面,沒有重寫所有抽象方法引起的思考
這幾天在學習關於jdk8的一些知識,在看到講解lambda表示式的引入原因時,舉了一個匿名類的例子,並進一步引入lambda表示式,因為lambda表示式比匿名類更簡潔明瞭易懂。 匿名類寫法如下: inventory.sort(new Com
Java中的Comparable介面和Comparator介面
介紹Comparable<T>介面和Comparator<T>介面都是JDK中提供的和比較相關的介面。使用它們可以對物件進行比較大小,排序等操作。這算是之後排序的先導知識吧。Comparable, 字面意思是“可以比較的”,所以實現它的類的多個例項應該可以相互比較“大小”或者
Comparable 和 Comparator 介面的比較
背景 Comparable equals compareTo Comparator
Comparable介面和Comparator介面的區別(通俗版)
概述 Comparable和Comparator都是用來實現集合中元素的比較、排序的。 Comparable是在集合內部定義的方法實現的排序,位於java.lang下。 Comparator是在集合外部實現的排序,位於java.util下。 Comparable是一個物件本
獲取實現了某介面的所有類,並返回該類中自定義的方法的方法名
準備階段: 定義介面和實現介面的類。 interface IMyInterface { void Write(); } /// <summary> /// 實現類1 /// </summary>
Comparable 和Comparator介面
Comparable 是提供一定排序的介面,而Comparator介面通過我們的自定義來比較。 所以Comparable希望提供自然順序的類,介面中的一個方法 int compareTo(object o)比較當前物件,在物件之後返回正值; 而Comparato
Python中呼叫OpenCV介面中的高斯混合模型,實現對運動目標的檢測,並保存錄制視訊
Python中呼叫OpenCV介面中的高斯混合模型(GMM),實現對運動目標的檢測 import numpy as np import cv2 # TODO: 本程式碼使用OpenCV介面中的高斯混合模型,實現對運動目標的檢測 cap = cv2.VideoCapture(
callable介面配合ExecutorService實現多執行緒處理資料,並接收返回值(2018-08-23)
/** * @author chenzhen * Created by chenzhen on 2018/8/22. */ @Data public class QuickPullGit implements Callable<ArrayList&l
JAVA中Arrays.sort()使用兩種方式(Comparable和Comparator介面)對物件或者引用進行排序
package com.dt.Sort; import java.util.Arrays; import java.util.Comparator; /** * 使用Comparator介面:編寫多個排序方式類實現Comparator介面,並重寫新Comparator介面中的compare()方法 pub
Comparable介面和Comparator介面的使用
1、Comparable介面生命了一個比較兩個物件大小的comparaTo()方法。 例如: public class Edge implements Comparable<Edge>{public int a;public int b;public int
Comparable介面和Comparator介面的比較
概述 在實際應用中,我們往往有需要比較兩個自定義物件大小的地方。而這些自定義物件的比較,就不像簡單的整型資料那麼簡單,它們往往包含有許多的屬性,我們一般都是根據這些屬性對自定義物件進行比較的。所以Java中要比較物件的大小或者要對物件的集合進行排序,需要通過比較
Java中Comparable和Comparator介面區別分析
Comparable 簡介 Comparable 是排序介面。 若一個類實現了Comparable介面,就意味著“該類支援排序”。 即然實現Comparable介面的類支援排序,假設現在存在“實現Comparable介面的類的物件的List列表(或陣列)”,則該List
):Comparable介面和Comparator介面
目錄 1 介紹 2 Comparable介面 3 Comparator介面 4 總結 1 介紹 有這樣2個人,一個人光頭,一個人有黑色頭髮,現在不允許染髮,只允許光頭的帶假髮,理由是有頭髮的人沒有必要再帶假髮,那麼誰可以有多種顏色的頭髮?在這種情況下,有頭髮的人,因為他的頭髮和自身繫結在一起,
集合框架(五)使用Comparable介面和Comparator介面來比較元素
1、有時希望將元素插入到一個樹集合中個,這些元素可能不是java.lang.Comparable的例項,這時可以定義一個比較器來比較這些元素。即需要建立一個實現java.util.Comparator介面的類。Comparator介面有兩個方法:compare和
Comparable和Comparator介面是幹什麼的?列出它們的區別
Java提供了只包含一個compareTo()方法的Comparable介面。這個方法可以個給兩個物件排序。具體來說,它返回負數,