天天看點

Java的Comparable内部比較器和Comparator外部比較器

//這裡簡單介紹一下Java的Comparable内部比較器和Comparator外部比較器的用法實作

//那麼我們來做一個關于對象間的排序,首先建一個Model或者叫JavaBen。如下:

//1.Java的Comparable内部比較器的用法實作:

//Comparable内部比較器(要讓實體類JavaBen(TestComparable )實作Comparable接口并重寫compareTo(Object o)方法)

//代碼實作如下:

//public interface Comparable<T>此接口強行對實作它的每個類的對象進行整體排序。

//這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法。

package com.xiawei.test;

public class TestComparable implements Comparable<Object> {

/**

* 賬單序号

*/

private int sequence = 0;

/**

* 賬單名稱

private String billName = "";

public TestComparable(int sequence,String billName){

this.sequence = sequence;

this.billName = billName;

}

public int getSequence() {

return sequence;

public void setSequence(int sequence) {

public String getBillName() {

return billName;

public void setBillName(String billName) {

//重寫Comparable接口的compareTo()方法

//int compareTo(T o) 比較此對象與指定對象的順序。如果該對象小于、等于或大于指定對象,則分别傳回負整數、零或正整數。 

//參數:

o

- 要比較的對象。

//傳回:負整數、零或正整數,根據此對象是小于、等于還是大于指定對象。

@Override

public int compareTo(Object obj) {

// TODO Auto-generated method stub

return this.getSequence() - ((TestComparable) obj).getSequence();

public String toString() {

return "TestComparable [賬單序号=" + sequence + ", 賬單名稱=" + billName + "]";

}

=======================================================================================

//測試一下效果,這裡是根據賬單對象的賬單序号private int sequence 來比較排序的:

package com.xiawei;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import com.xiawei.test.TestComparable;

public class Main {

public static void main(String[] args) {

//Comparable内部比較器(要讓實體類(Model)實作Comparable接口并重寫compareTo(Object o)方法)

List<TestComparable> lis = new ArrayList<TestComparable>();

lis.add(new TestComparable(1,"生活費支出"));

lis.add(new TestComparable(2,"旅遊支出"));

Collections.sort(lis);

System.out.println(lis);

輸出結果:

[TestComparable [賬單序号=1, 賬單名稱=生活費支出],

TestComparable [賬單序号=2, 賬單名稱=旅遊支出]]

//同樣這裡我們來做一個關于對象間的排序,是以首先建一個Model或者叫JavaBen。如下:

//2.Java的Comparator外部比較器的用法實作:

//Comparator外部比較器 (單獨定義一個類實作Comparator接口并重寫compare(Object o1,Object o2)方法)

package com.xiawei.model;

public class BillInfo {

* 賬單金額

private double billMoney = 0;

* 出賬日期

private String date = "";

public BillInfo(int sequence,String billName,double billMoney,String date){

this.billMoney = billMoney;

this.date = date;

public double getBillMoney() {

return billMoney;

public void setBillMoney(double billMoney) {

public String getDate() {

return date;

public void setDate(String date) {

return "BillInfo [賬單序号=" + sequence + ", 賬單名稱=" + billName + ", 賬單金額=" + billMoney + ", 出賬日期="

+ date + "]";

=====================================================================================

//單獨定義一個類實作Comparator接口并重寫compare(Object o1,Object o2)方法,代碼如下:

// int compare(T o1,T o2) : 比較用來排序的兩個參數。根據第一個參數小于、等于或大于第二個參數分别傳回負整數、零或正整數。

// 參數:

o1

- 要比較的第一個對象。

o2

- 要比較的第二個對象。

//傳回:根據第一個參數小于、等于或大于第二個參數分别傳回負整數、零或正整數。 

package com.xiawei.summary;

import java.util.Comparator;

import com.xiawei.model.BillInfo;

public class BillInfoComparator implements Comparator<BillInfo> {

@Override

public int compare(BillInfo b1, BillInfo b2) {

BillInfo bill1 = (BillInfo) b1;

BillInfo bill2 = (BillInfo) b2;

int result = bill1.getSequence() > bill2.getSequence()?1:

(bill1.getSequence() == bill2.getSequence())?0:-1;

return result = result == 0?(bill1.getBillMoney() > bill2.getBillMoney()?1:-1):result;

=========================================================================

//測試一下效果,這裡也是根據賬單對象的賬單序号private int sequence 來比較排序的:

import com.xiawei.summary.BillInfoComparator;

//Comparator外部比較器 (單獨定義一個類實作Comparator接口并重寫compare(Object o1,Object o2)方法)

List<BillInfo> list = new ArrayList<BillInfo>();

list.add(new BillInfo(4,"食品支出",100.0,"2017-01-01"));

list.add(new BillInfo(2,"旅遊支出",200.0,"2017-02-01"));

list.add(new BillInfo(5,"教育支出",300.0,"2017-03-01"));

list.add(new BillInfo(3,"投資支出",400.0,"2017-04-01"));

list.add(new BillInfo(1,"交通支出",500.0,"2017-05-01"));

Collections.sort(list,new BillInfoComparator());

System.out.println(list);

輸出結果:

[BillInfo [賬單序号=1, 賬單名稱=交通支出, 賬單金額=500.0, 出賬日期=2017-05-01],

BillInfo [賬單序号=2, 賬單名稱=旅遊支出, 賬單金額=200.0, 出賬日期=2017-02-01],

BillInfo [賬單序号=3, 賬單名稱=投資支出, 賬單金額=400.0, 出賬日期=2017-04-01],

BillInfo [賬單序号=4, 賬單名稱=食品支出, 賬單金額=100.0, 出賬日期=2017-01-01],

BillInfo [賬單序号=5, 賬單名稱=教育支出, 賬單金額=300.0, 出賬日期=2017-03-01]]

繼續閱讀