1. 程式人生 > >實現Comparable介面和Comparator介面,並重寫compareTo方法和compare方法

實現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

ComparableComparator介面比較

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()使用兩種方式(ComparableComparator介面)對物件或者引用進行排序

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中ComparableComparator介面區別分析

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和

ComparableComparator介面是幹什麼的?列出它們的區別

Java提供了只包含一個compareTo()方法的Comparable介面。這個方法可以個給兩個物件排序。具體來說,它返回負數,