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 ...
随机推荐
- Vue 获取dom元素中的自定义属性值
方法一: HTML <div id="app"> <button @click="getData($event,'100')">点我&l ...
- AcWing P378 骑士放置 题解
Analysis 这道题跟前几道题差不多,依旧是匈牙利算法求二分图匹配,在连边的时候,要连两个矛盾的位置(即一个骑士和其控制的位置).然后就跑一遍匈牙利算法就好了. #include<iostr ...
- [Bob]Collectors Problem
https://vjudge.net/problem/UVA-10779#author=0 网络流 1.Bob向他有的贴纸连边,流量为他有的贴纸数量 2.每一种贴纸向汇点连流量为1的边 3.其余人,如 ...
- C++类中静态数据成员MAP如何初始化
conv_xxx.hpp class convolution { ... ... typedef std::map<int, std::string> ConvDtMap; static ...
- pandas记录
pandas的map方法使用 import pandas as pd import numpy as np data = pd.DataFrame(np.random.randint(0, 10, ( ...
- 2018-2019-2 20165114《网络对抗技术》 Exp 8 Web基础
Exp 8 Web基础 目录 一.实验内容 二.基础问题回答 (1)什么是表单 (2)浏览器可以解析运行什么语言. (3)WebServer支持哪些动态语言 三.实践过程记录 3.1Web前端HTML ...
- DELPHI正则表达式
DELPHI正则表达式 1)下载源码 官方网站: http://www.regular-expressions.info/delphi.html 直接下载: http://www.regula ...
- Mysql -- BLOB, TEXT, GEOMETRY or JSON column 'result' can't have a default value
执行上面的代码, 即可解决, 不过mysql重启之后还会有问题. 根本解决: 将mysql的配置文件中的sql_mode项 注释掉.
- arcgis python 调用工具两种两种方法
arcpy.Select_analysis("p","kk") arcpy.analysis.Select("p","kk1&qu ...
- PHP try catch 如何使用
<?php try { if (file_exists('test_try_catch.php')) { require ('test_try_catch.php'); } else { ...