工具类

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自定义排序工具类的更多相关文章

  1. 小米开源文件管理器MiCodeFileExplorer-源码研究(8)-文件排序工具类FileSortHelper

    FileSortHelper的核心功能就是,对文件集合FileInfo排序.FileInfo有若干字段,根据字段定义了4种比较器Comparator.调用示例:Collections.sort(Lis ...

  2. spring-boot-jpa 自定义查询工具类

    1.pom文件中添加如下配置 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  3. Android 自定义Dialog工具类

    由于项目的需要,系统的弹出框已经不能满足我们的需求,我们需要各式各样的弹出框,这时就需要我们去自定义弹出框了. 新建布局文件 dialog_layout.xml,将下面内容复制进去 <?xml ...

  4. Comparator与Comparable,自定义排序和类比较器,TreeSet对象排序

    /** * 学生类 * @author Administrator * */ public class Student { private String sno ; private String sn ...

  5. 对于java自定义的工具类的提炼 注意事项

    1.工具类的方法都用static修饰. 因为工具类一般不创建对象,直接类名.方法()使用 2.一些 定义的常亮需要 public static final 修饰. 3.一些与数据库的连接之类的设定 , ...

  6. 自定义JDBC工具类

    因为数据库的连接代码都是固定的,为了将减少重复的代码的书写,可以将这些代码封装为一个工具类,获取数据库的连接对象. import java.sql.Connection; import java.sq ...

  7. OpenGL学习——自定义Shader工具类

    从文件读取Vertex Shader 和 Fragment Shader的工具类. 代码如下: Shader.h #ifndef Shader_h #define Shader_h // GLEW # ...

  8. spring项目中 通过自定义applicationContext工具类获取到applicationContext上下文对象

    spring项目在服务器启动的时候 spring容器中就已经被创建好了各种对象,在我们需要使用的时候可以进行调用. 工具类代码如下 import org.springframework.beans.B ...

  9. JDBC基础篇(MYSQL)——自定义JDBCUtil工具类

    package util; import java.io.File; import java.io.InputStream; import java.sql.Connection; import ja ...

随机推荐

  1. 根据参数显示类别(三级联动,需要JSON数据)

    根据参数显示类别(三级联动,需要JSON数据) Scripts/Category.js 调用方法: $(function () { BindCategory(); //默认绑定文本框中的值 BindC ...

  2. 52、[源码]-Spring源码总结

    52.[源码]-Spring源码总结 总结 一.Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息: xml注册bean: 注解注册Bean:@Service.@Component ...

  3. sping boot 笔记 哎呦不错哦

    http://blog.csdn.net/u011998835/article/details/78352829 学习

  4. sql server join ,inner join ,left join ,right join 的使用

    测试数据脚本 CREATE TABLE Atable ( S# INT, Sname nvarchar(32), Sage INT, Sfrom nvarchar(8) ) insert into A ...

  5. HTML5中table标签与form标签的区别

    html中form表示一个表单,用来把一系列的控件包围起来,然后再统一发送这些数据到目标,比如最常见的注册,你说需要填写的资料,都是被封装在form里的,填写完毕后,提交form内的内容,如果不再fo ...

  6. wepy项目的学习

    使用Promise 开发实时编译 wepy build --watch 安装依赖 cd myproject npm install 安装(更新) wepy 命令行工具. npm install wep ...

  7. Matlab学习——求解微分方程(组)

    介绍: 1.在 Matlab 中,用大写字母 D 表示导数,Dy 表示 y 关于自变量的一阶导数,D2y 表示 y 关于自变量的二阶导数,依此类推.函数 dsolve 用来解决常微分方程(组)的求解问 ...

  8. kde下面设置plasma_notes字体

    只要编辑home目录下vim .local/share/plasma_notes/06af6151-fd00-4cf4-890b-96d783da03,例如: 1 <!DOCTYPE HTML ...

  9. 【python代码】linux 登陆网关

    #!/usr/bin/env python import urllib2 url="http://10.3.8.211" data="DDDDD=2010111222&a ...

  10. 简单动态字符串-redis设计与实现

    简单动态字符串 Sds (Simple Dynamic String,简单动态字符串)是 Redis 底层所使用的字符串表示, 几乎所有的 Redis 模块中都用了 sds. 本章将对 sds 的实现 ...