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")
@Test
public 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());
}
} }
list自定义排序工具类的更多相关文章
- 小米开源文件管理器MiCodeFileExplorer-源码研究(8)-文件排序工具类FileSortHelper
FileSortHelper的核心功能就是,对文件集合FileInfo排序.FileInfo有若干字段,根据字段定义了4种比较器Comparator.调用示例:Collections.sort(Lis ...
- spring-boot-jpa 自定义查询工具类
1.pom文件中添加如下配置 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...
- Android 自定义Dialog工具类
由于项目的需要,系统的弹出框已经不能满足我们的需求,我们需要各式各样的弹出框,这时就需要我们去自定义弹出框了. 新建布局文件 dialog_layout.xml,将下面内容复制进去 <?xml ...
- Comparator与Comparable,自定义排序和类比较器,TreeSet对象排序
/** * 学生类 * @author Administrator * */ public class Student { private String sno ; private String sn ...
- 对于java自定义的工具类的提炼 注意事项
1.工具类的方法都用static修饰. 因为工具类一般不创建对象,直接类名.方法()使用 2.一些 定义的常亮需要 public static final 修饰. 3.一些与数据库的连接之类的设定 , ...
- 自定义JDBC工具类
因为数据库的连接代码都是固定的,为了将减少重复的代码的书写,可以将这些代码封装为一个工具类,获取数据库的连接对象. import java.sql.Connection; import java.sq ...
- OpenGL学习——自定义Shader工具类
从文件读取Vertex Shader 和 Fragment Shader的工具类. 代码如下: Shader.h #ifndef Shader_h #define Shader_h // GLEW # ...
- spring项目中 通过自定义applicationContext工具类获取到applicationContext上下文对象
spring项目在服务器启动的时候 spring容器中就已经被创建好了各种对象,在我们需要使用的时候可以进行调用. 工具类代码如下 import org.springframework.beans.B ...
- JDBC基础篇(MYSQL)——自定义JDBCUtil工具类
package util; import java.io.File; import java.io.InputStream; import java.sql.Connection; import ja ...
随机推荐
- Java中CAS-ABA的问题解决方案
忻州SEO摘要 CAS即对比交换,它在保证数据原子性的前提下尽可能的减少了锁的使用,很多编程语言或者系统实现上都大量的使用了CAS. 了解CAS(Compare-And-Swap) CAS即对比交 ...
- Mongodb 查询优化(慢查询Profiling)
开启慢查询Profiling Profiling级别说明 0:关闭,不收集任何数据. 1:收集慢查询数据,默认是100毫秒. 2:收集所有数据 1.通过修改配置文件开启Profiling 修改启动mo ...
- EAST结构分析+pytorch源码实现
目录 EAST结构分析+pytorch源码实现 @ 一. U-Net的前车之鉴 1.1 FCN网络结构 1.2 U-NET网络 1.3 CTPN网络 二. EAST结构分析 2.1 结构简述 2.2 ...
- Readiness probe failed:connection refused
我的K8S集群在启动一个POD的时候说死起不来,然后就报下面的错误 Events: Type Reason Age From Message ---- ------ ---- ---- ------- ...
- Mac 安装软件时,提示已损坏解决
"xxx.app已损坏,打不开.你应该将它移到废纸篓",并非你安装的软件已损坏,而是Mac系统的安全设置问题,因为这些应用都是破解或者汉化的,那么解决方法就是临时改变Mac系统安全 ...
- tornado解析post数据的问题
解析tornado查询参数: self.request.query_arguments self.get_query_argument[s](参数名称) 解析tornado的post参数: self. ...
- TCP数据报结构以及三次握手
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的.可靠的.基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接. 客户端在收发数据前要 ...
- [luogu P1527]矩阵乘法(矩形k小)
传送门 Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. Solution 整体二分 练习一波... 就是一堆询问放在一起二分 另外的,第一次发现原来矩 ...
- 走进JavaWeb技术世界12:从手动编译打包到项目构建工具Maven
小李的Build之路(上) 转自: 刘欣 码农翻身 2016-07-10 摘要:手工Build的烦恼要不是为了和女朋友留在一个城市,小李肯定去北上广奋斗去了.现在他只能留在这个2.5线城市,进入这家软 ...
- RK3399 4G模块移远EC20移植调试
转载请注明出处:https://www.cnblogs.com/lialong1st/p/11266330.html CPU:RK3399 系统:Android 7.1 1.通过串口打印或者adb获取 ...