//這裡簡單介紹一下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]]