`
tree_161219
  • 浏览: 85885 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

compare 应用实例

阅读更多

整理2个compare 接口排序的实现方法:

 

 

一、 自己实现比较方法,包括一些复杂的多条件比较

 

public class Comparator {
	private String mothdName;

	/**
	 * 比较器,可以根据具体VO定制排序
	 * @param mothdName
	 * @return
	 */
	public java.util.Comparator getComparator(final String mothdName) {
		this.mothdName = mothdName;
		return new java.util.Comparator() {
			public int compare(Object o1, Object o2) {
				if (o1 instanceof String) {
					return compare((String) o1, (String) o2);
				} else if (o1 instanceof Integer) {
					return compare((Integer) o1, (Integer) o2);
				}else if (o1 instanceof Timestamp) {
					return compare((Integer) o1, (Integer) o2);
				}else if (o1 instanceof Date) {
					return compare((Integer) o1, (Integer) o2);
				} else if (o1 instanceof BpmTaskVo) {
					return compare((BpmTaskVo) o1, (BpmTaskVo) o2);
				} else {
					System.err.println("未找到合适的比较器");
					return 1;

				}
			}

			public int compare(String o1, String o2) {
				return o1.compareTo(o2);
			}
			public int compare(Integer o1, Integer o2) {
				return o1.compareTo(o2);
			}
			public int compare(Boolean o1, Boolean o2) {
				return o1.compareTo(o2);
			}
			public int compare(Timestamp o1, Timestamp o2){
				return o1.compareTo(o2);
			}
			public int compare(Date o1, Date o2){
				return o1.compareTo(o2);
			}
			
			
			//为BpmTaskVo 定制排序
			public int compare(BpmTaskVo vo1, BpmTaskVo vo2) {
				Class<BpmTaskVo> voClass = BpmTaskVo.class;
				Method mothdGet;
				// mGet.setAccessible(true);//因为写成private 取值可以不设置
				int i = 0;
				try {
					mothdGet = voClass.getDeclaredMethod(mothdName);
					Object o1 = mothdGet.invoke(vo1);
					Object o2 = mothdGet.invoke(vo2);
//					System.out.println("方法名"+mothdName + "比较值o1 = "+o1 + "    o2 = "+o2);
					i = compare(o1,o2);
				} catch (Exception e) {
					e.printStackTrace();
				}
				return i;
			}

			// 多条件比较
			public int compare(BpmTaskVo o1, BpmTaskVo o2) {
				String firstname1 = o1.getFirstName();
				String firstname2 = o2.getFirstName();
				String lastname1 = o1.getLastName();
				String lastname2 = o2.getLastName();
				Boolean sex1 = o1.getSex();
				Boolean sex2 = o2.getSex();
				Integer age1 = o1.getAge();
				Integer age2 = o2.getAge();
				return (compare(firstname1, firstname2) == 0 ? (compare(lastname1, lastname2) == 0 ? (compare(sex1, sex2) == 0 ? (compare(age1, age2) == 0 ? 0 : compare(age1, age2)) : compare(sex1, sex2)) : compare(lastname1, lastname2)) : compare(firstname1, firstname2));
			}
		};
	}

}

 

 

二、 利用反射和compareTo,动态比较。这种是比较好的方法

 

public class RmComparator {

	/**
	 * 比较器,可以根据VO具体字段比较
	 * 
	 * @param mothdName
	 * @return
	 */
	public Comparator getComparator(final String mothdName) {
		return new Comparator() {
			public int compare(Object o1, Object o2) {
				int val = 0;//默认不排序
				try {
					if (mothdName == null) {
						val = myCompare(o1, o2);
					} else {
						val = myCompare(getValue(o1, mothdName), getValue(o2, mothdName));
					}
				} catch (Exception ex) {
					ex.printStackTrace();
				}
				return val;
			}
			// VO中取值
			public Object getValue(Object bean, String methodName) throws Exception {
				Method getMethod = bean.getClass().getMethod(methodName, null);
				return getMethod.invoke(bean, null);
			}

			// 具体执行比较的方法
			public int myCompare(Object obj1, Object obj2) throws Exception {
				if (obj1 == null || obj2 == null){
					return obj1 == null ? -1 : 1;
				}
				Class cl = obj1.getClass();
				if (obj1 instanceof java.lang.Comparable) {
					// byte int long float..number, date , boolean , char,String
					Method getMethod = obj1.getClass().getMethod("compareTo", new Class[] { cl });
					return (Integer) getMethod.invoke(obj1, new Object[] { obj2 });
				}
				return 0;//默认不排序
			}
		};
	}
 

 

 

 

分享到:
评论

相关推荐

    Compare Table Data功能介绍

    以实例的方式介绍了PLSQL Developer工具中Compare Table Data命令的使用

    风声 ASP 无组件上传类应用实例

    风声 ASP 无组件上传类应用实例,配置实例: Private Sub Class_Initialize m_Error = -1 m_Charset = "gb2312" m_TotalSize= 0 m_MaxSize = 153600 m_FileType = "jpg/gif" m_SavePath = "" m_AutoSave = 0...

    LocateElem()&ListTraverse;()实例说明

    LocateElem(L,e,compare())&ListTraverse;(L,visit())实例说明

    51单片机基础应用设计C语言实例源码仿真300个合集.zip

    51单片机基础应用设计C语言实例源码仿真300个合集: 100000秒以内的计时程序 10秒的秒表 12864LCD图形滚动演示 128X64LED 160128LCD图文演示 1602字符液晶滚动演示程序 1602液晶显示的DS1302实时时钟 16×16点阵...

    AVR系列单片机竞赛设计实例程序22例PROTEUS仿真资料.zip

    AVR系列单片机竞赛设计实例程序22例PROTEUS仿真资料: 32x16LED汉字字幕程序 AT90S8535_ADC转换应用 AVR_Uart串口应用 DS18B20仿真实例 DS18B20仿真实例+加串口通信 M16_AD M16_AD转换电压表 M16_AN_Compare M16_...

    200个单片机设计Protues仿真实例74系列COMS系列芯片仿真Protues芯片模型.zip

    Protues仿真实例(8051)-PCF8574应用 Protues仿真实例(8051)-PWM控制LED的亮度仿真程序 Protues仿真实例(8051)-PWM控制马达的方法 Protues仿真实例(8051)-PWM波输出(可调) Protues仿真实例(8051)-PWM测试...

    compare-api-node-client:适用于Draftable文档比较API的Node.js客户端库

    要求操作系统:任何维护Linux,macOS或Windows版本Node.js运行时:任何维护的版本 入门创建一个免费的API帐户检索您的凭证安装库npm install @draftable/compare-api 实例化客户端var client = require ( '@...

    php常用字符串比较函数实例汇总

    本文实例汇总了php常用字符串比较函数。分享给大家供大家参考。具体分析如下: substr_compare() 函数从指定的开始长度比较两个字符串,该函数返回: 0 – 如果两字符串相等,&lt;0&gt;0 – 如果 string1 (从开始位置)大于 ...

    schema-compare:基于模式深度比较两个对象

    这给了我一些我可以在使用时配置的东西,以允许我想到的那种比较。 如何 npm install schema-compare var schemaCompare = require('schema-compare'); var schema = { foo: [], bar: [{ baz: null }] quux: ...

    crypto_compare:适用于Python的CryptoCompare.com API客户端

    crypto_compare 适用于Python的CryptoCompare.com API客户端文件夹/代码结构编写代码后,所有方法都可以作为Client类中的实例方法使用,但将它们分组在diff中。 apis模块下的模块,以保持代码可读性。 所有这些模块...

    入门学习Linux常用必会60个命令实例详解doc/txt

    入门学习Linux常用必会60个命令实例详解 Linux必学的60个命令 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不...

    300个C51单片机设计proteus仿真源码软件源码.rar

    液晶,传递函数模型综合应用的实例 DIY51式数控电源 DS1621温度传感器实验 ds18b20 DS18B20温度传感器实验 DS18B20温度检测及其液晶显示 HorseLight I2C IIC-24C04与数码管 IIC-24C04与蜂鸣器 INT0与INT1中断计数 ...

    完整版SPSS数据分析软件基础 中级教程 CHAP 18 多选变量的分析.ppt

    全球约有25万家产品用户,它们分布于通讯、医疗、银行、证券、保险、制造、商业、市场研究、科研教育等多个领域和行业,是世界上应用最广泛的专业统计软件。在国际学术界有条不成文的规定,即在国际学术交流中,凡是...

    Word_2003域应用

    三、域应用实例详解 26 1.插入“题注” 26 (1)新建标签 26 (2)自动插入题注 26 (3)手动插入题注 26 (4)调整图片编号 27 2.交叉引用题注 27 (1)插入交叉引用题注 27 (2)管理交叉引用题注 27 3.交叉引用标题 28 (1)...

    PHP SPL标准库之数据结构堆(SplHeap)简单使用实例

    堆(Heap)就是为了实现优先队列而设计的一种数据结构,它是通过构造二叉堆(二叉树的一种)实现。根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做... //compare()方法用来比较两个元素的大小,绝对他们在堆中的位置

    C中qsort快速排序使用实例

    代码如下:/************************************************************************qsort原型:void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *...

    RedGate(SQL数据库备份工具).zip

    SQL Comparison SDK 8 这个其下很多工具的API扩展实例,包含C#和VB的源代码 SQL Backup 6 数据库备份工具,可以快速查看数据库备份的时间,具体使用大家自己试试就知道了,挺强大的. SQL Changeset 1 具体没有使用...

    Linq两个List集合取交集的实现

    您可能感兴趣的文章:C#中Linq查询基本操作使用实例c#中LINQ的基本用法实例C# linq查询之动态OrderBy用法实例C#中的Linq Intersect与Except方法使用实例C#中的Linq to Xml详解LINQ 标准查询操作符linq语法基础使用...

    RedisSyncer是一个多任务的redis数据同步工具,可灵活的满足Redis间的数据同步、迁移需求

    RedisSyncer是一个redis多任务同步工具集,应用于redis单实例及集群同步。 该工具集包括: redis 同步服务引擎 redissyncer-server redissycner 客户端 redissyncer-cli dashboard web控制面板 redissycner-...

    my-wdio:我第一次尝试使用webdriverio

    wdio-native-app-compare-service fs-extra spec 安装套件 $ npm install 在桌面Chrome上运行功能测试 $ npm test wdio-image-comparision-service视觉测试 在Android chrome上运行测试 $ npm run web:android 在...

Global site tag (gtag.js) - Google Analytics