博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java的Comparable内部比较器和Comparator外部比较器
阅读量:6161 次
发布时间:2019-06-21

本文共 5138 字,大约阅读时间需要 17 分钟。

//这里简单介绍一下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) {
this.sequence = sequence;
}
public String getBillName() {
return billName;
}
public void setBillName(String billName) {
this.billName = billName;
}
//重写Comparable接口的compareTo()方法

//int compareTo( o) 比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。 

//参数:o - 要比较的对象。

//返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。

@Override
public int compareTo(Object obj) {
// TODO Auto-generated method stub
return this.getSequence() - ((TestComparable) obj).getSequence();
}

@Override

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 int sequence = 0;
/**
* 账单名称
*/
private String billName = "";
/**
* 账单金额
*/
private double billMoney = 0;
/**
* 出账日期
*/
private String date = "";
public BillInfo(int sequence,String billName,double billMoney,String date){
this.sequence = sequence;
this.billName = billName;
this.billMoney = billMoney;
this.date = date;
}
public int getSequence() {
return sequence;
}
public void setSequence(int sequence) {
this.sequence = sequence;
}
public String getBillName() {
return billName;
}
public void setBillName(String billName) {
this.billName = billName;
}
public double getBillMoney() {
return billMoney;
}
public void setBillMoney(double billMoney) {
this.billMoney = billMoney;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
@Override
public String toString() {
return "BillInfo [账单序号=" + sequence + ", 账单名称=" + billName + ", 账单金额=" + billMoney + ", 出账日期="
+ date + "]";
}
}

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

//单独定义一个类实现Comparator接口并重写compare(Object o1,Object o2)方法,代码如下:

// int compare( o1, 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 来比较排序的:

package com.xiawei;

import java.util.ArrayList;

import java.util.Collections;
import java.util.List;

import com.xiawei.model.BillInfo;

import com.xiawei.summary.BillInfoComparator;

public class Main {

public static void main(String[] args) {

//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]]

转载于:https://www.cnblogs.com/xiaweicn/p/8688216.html

你可能感兴趣的文章
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
淘宝的几个架构图
查看>>
linux后台运行程序
查看>>
Python异步IO --- 轻松管理10k+并发连接
查看>>
Oracle中drop user和drop user cascade的区别
查看>>
登记申请汇总
查看>>
Android Jni调用浅述
查看>>
CodeCombat森林关卡Python代码
查看>>
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Shell基础之-正则表达式
查看>>
JavaScript异步之Generator、async、await
查看>>
讲讲吸顶效果与react-sticky
查看>>
c++面向对象的一些问题1 0
查看>>
售前工程师的成长---一个老员工的经验之谈
查看>>