list自定义排序工具类
工具类
package sort;
import java.lang.reflect.Method;
import java.text.Collator;
import java.util.Comparator;
import java.util.Date;/*** @Title: LocalComparator.java* @Package* @Description: TODO(用一句话描述该文件做什么)* @author licy* @date 2018年11月8日* @version V1.0*/public class LocalComparator implements Comparator{private Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);/*** 排序字段**/private String[] sortBy;/** 字段对应排序类型 (1:升序,-1:降序) 一一对应*/private int[] order;public LocalComparator(String[] sortBy, int[] order) {this.sortBy = sortBy;this.order = order;}/** 定义排序规则 如果按照不止一个属性进行排序 这按照属性的顺序进行排序,类似sql order by 即只要比较出同位置的属性就停止*/public int compare(Object o1, Object o2) {for (int i = 0; i < sortBy.length; i++) {Object value1 = getFieldValueByName(sortBy[i], o1);Object value2 = getFieldValueByName(sortBy[i], o2);if (value1 instanceof Integer && value2 instanceof Integer) {int v1 = Integer.parseInt(value1.toString());int v2 = Integer.parseInt(value2.toString());if (v1 > v2) {return 1 * this.order[i];} else if (v1 < v2) {return -1 * this.order[i];}} else if (value1 instanceof Long && value2 instanceof Long) {Long v1 = (Long) value1;Long v2 = (Long) value2;if (v1 > v2) {return 1 * this.order[i];} else if (v1 < v2) {return -1 * this.order[i];}} else if (value1.getClass() == Date.class && value2.getClass() == Date.class) {Date time1 = (Date) value1;Date time2 = (Date) value2;if (time1.getTime() > time2.getTime()) {return 1 * this.order[i];} else if (time1.getTime() < time2.getTime()) {return -1 * this.order[i];}} else {int result = cmp.compare(value1, value2);if (result != 0) {return result * this.order[i];}}}return 1;}/*** * 通过反射,获取属性值* * @param fieldName* @param o* @return*/private Object getFieldValueByName(String fieldName, Object o) {try {String firstLetter = fieldName.substring(0, 1).toUpperCase();String getter = "get" + firstLetter + fieldName.substring(1);Method method = o.getClass().getMethod(getter, new Class[] {});Object value = method.invoke(o, new Object[] {});return value;} catch (Exception e) {System.out.println("属性不存在");return null;}}
}
测试类
package sort.test;/*** @Title: Persion.java* @Package sort.test* @Description: TODO(用一句话描述该文件做什么)* @author licy* @date 2018年11月8日* @version V1.0*/public class Persion {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Persion() {super();// TODO Auto-generated constructor stub}public Persion(String name, int age) {super();this.name = name;this.age = age;}}
执行测试类
package sort.test;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;import org.junit.Test;import sort.LocalComparator;public class ComparatorTest {@SuppressWarnings("unchecked")@Testpublic void test() {List list = new ArrayList();Persion p1 = new Persion("a", 3);Persion p2 = new Persion("b", 2);Persion p3 = new Persion("b", 1);list.add(p1);list.add(p2);list.add(p3);String[] sortBy = new String[] { "name", "age" };int[] order = new int[] { 1, -1 };LocalComparator lc = new LocalComparator(sortBy, order);Collections.sort(list, lc);for(int i=0;i<list.size();i++) {Persion p = (Persion) list.get(i);System.out.println(p.getName() + ":" + p.getAge());}}}
转载于:https://www.cnblogs.com/lichangyunnianxue/p/9933660.html
list自定义排序工具类相关推荐
- Java通用工具类之按对象属性排序工具类
本工具类为按对象属性排序工具类,实现的功能: 1.按对象的一个属性和多个属性进行排序. 2.按对象属性正序和倒序排列. 3.完美支持int等基础类和Integer等包装类. 4.完美支持属性为实现了C ...
- 小米开源文件管理器MiCodeFileExplorer-源码研究(8)-文件排序工具类FileSortHelper
FileSortHelper的核心功能就是,对文件集合FileInfo排序. FileInfo有若干字段,根据字段定义了4种比较器Comparator. 调用示例:Collections.sort(L ...
- JAVA 排序工具类
提供了以下排序: 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归并排序 桶排序 堆排序 package com.xingej.algorithm.sort;import java.util.Ar ...
- java 工具类sort_Java 通用排序工具类ListSortUtils
场景:Java 类 需 重新排序,有时升序.有时倒叙,有时是多字段排序 代码: package GenericTest; import java.lang.reflect.InvocationTarg ...
- 自定义日期工具类 java 1614698552
自定义日期工具类 java 1614698552 需求 思路 演练 日期转字符串的方法 字符串转日期方法 测试类 更多尝试 测试另一个方法
- java堆排序工具包_JAVA 排序工具类
提供了以下排序:冒泡排序 选择排序 插入排序 希尔排序 快速排序 归并排序 桶排序 堆排序 package com.xingej.algorithm.sort;import java.util.Arr ...
- 解密android日志xlog,安卓开发技巧2:自定义日志工具类XLog的实现
安卓开发技巧二:自定义日志工具类XLog的实现 我们在开发过程中,打印日志是必不可少的一个调试环节,然而,直接使用系统自带的Log日志类,并不能满足我们实际项目的需求:假如我们现在在开发一款比较大的项 ...
- 自定义反序列化工具类
自定义反序列化工具类 在实体类中实现了 implements Serializable 序列化 还实现了 UserDetails 对传入的字段 authorities 返序列化失败 对字段 autho ...
- java list排序工具类_java 之 Collections集合工具类排序
数组有工具类Arrays,集合也有一个工具类Collections. sort方法: sort(List list):根据其元素natural ordering对制定的列表进行排序 sort(List ...
- 弄清std::chrono::system_clock::time_point,自定义时间工具类
time_t 是32位的整数,用来存放格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,不能表示毫秒,约能表示135年 time ...
最新文章
- vue请求在退出页面还执行吗_如何用 Cloudbase Framework 部署一个 Vue 项目
- Google下的这盘“小”棋
- ESP8266的一个小问题
- birt脚本for循环_Shell脚本应用 – for、while循环语句
- 10. VMware Tools 安裝
- 访问不了html的内容,index.html文件内容与实际访问结果不同
- 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别...
- Python学习总结(4)——运算符
- golangd历史版本下载路径
- Python中更新pip版本的那些事
- 计算机二级C语言选择题怎么做?要注意些什么?(易错点难点总结笔记)
- python智能写诗的程序_【百度大脑新品体验】智能写诗与智能春联
- getParameter和getParameterValues
- java图片文字识别_java初探Tess4j识别图片文字
- PhotoShop .psd文件格式读取分析(结合unity)
- 【HUSTOJ】1049: 字符图形5-星号梯形
- 赫兹的单位换算_赫兹单位换算(赫兹的单位换算公式)
- Protothreads:一个“蝇量级” C 语言协程库
- 前后端分离,不在同一服务器上部署,报错“strict-origin-when-cross-origin”解决
- vs code快速复制一行代码 快捷键