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 ...
随机推荐
- javaWeb下载
---恢复内容开始--- 下载 1. 下载就是向客户端响应字节数据! 原来我们响应的都是html的字符数据! 把一个文件变成字节数组,使用response.getOutputStream()来各应 ...
- docker学习(四)
一.Docker数据管理 在容器中管理数据主要有两种方式:1.数据卷(Data volumes)2.数据卷容器(Data volume containers) 1.数据卷数据卷是一个可供一个或多个容器 ...
- 查看工程里有多少行java代码
/** * @Classname CustBankcardServiceImpl * @Description 计算项目代码量(行数) * @Date 2019/11/04 14:24 * @Crea ...
- pstmt.getGeneratedKeys()更换jar包后报错
改成: pstmt=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); rs=pstmt.getGeneratedKeys(); 即 ...
- 四十三.MongoDB副本集 MongoDB文档管理
一.部署MongoDB副本集 1.1 启用副本集配置并指定集群名称 rs1 1.2 定义集群成员列表 部署好机器51,52,53:51上配置 bind_ip=192.168.4.51(要改) port ...
- AdvanceEast源码理解
目录 文章思路 源码理解 一. 标签点形式 按顺序排列四个点,逆时针旋转,且第一个点为左上角点(刚开始选择最左边的点, 二. 标签切边 三. loss计算 四. NMS 最后说明 文章思路 大神的gi ...
- jQuery多选和单选下拉框插件select.js
一.插件描述 可通过参数设置多选或者单选,多选返回数组结果,单选返回字符串,如图: 下载地址:https://pan.baidu.com/s/1JjVoK89_ueVVpfSlMDJwUQ 提取码 ...
- nginx的跨域设置
官方文档 中说,只有当响应状态码为以下几种类型中之一时,add_header 才会生效.如果需要 add_header 在所有情况下都生效,可以在后面加上 always 参数即可解决. Adds th ...
- zabbix(9)iterms(监控项)
一.iterms key 监控项按参数来分有两种:带参数和不带参 按定义来分:zabbix自带和用户自定义 1)Key可以带参数,该参数为一个数组列表,可以同时传递多个参数,Key的格式如下: 既Ke ...
- ROUND() 函数
ROUND() 函数 ROUND 函数用于把数值字段舍入为指定的小数位数. SQL ROUND() 语法 SELECT ROUND(column_name,decimals) FROM table_n ...