对List对象按照某个成员变量进行排序
/**
* 对List对象按照某个成员变量进行排序
* @param list List对象
* @param sortField 排序的属性名称
* @param sortMode 排序方式:ASC,DESC 任选其一
*/
public static <T> void sortList(List<T> list, final String sortField, final String sortMode) {
Collections.sort(list, new Comparator<T>() {
@Override
public int compare(T o1, T o2) {
try {
Class clazz = o1.getClass();
Field field = clazz.getDeclaredField(sortField); //获取成员变量
field.setAccessible(true); //设置成可访问状态
String typeName = field.getType().getName().toLowerCase(); //转换成小写 Object v1 = field.get(o1); //获取field的值
Object v2 = field.get(o2); //获取field的值 boolean ASC_order = (sortMode == null || "ASC".equalsIgnoreCase(sortMode)); //判断字段数据类型,并比较大小
if(typeName.endsWith("string")) {
String value1 = v1.toString();
String value2 = v2.toString();
return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
}
else if(typeName.endsWith("short")) {
Short value1 = Short.parseShort(v1.toString());
Short value2 = Short.parseShort(v2.toString());
return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
}
else if(typeName.endsWith("byte")) {
Byte value1 = Byte.parseByte(v1.toString());
Byte value2 = Byte.parseByte(v2.toString());
return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
}
else if(typeName.endsWith("char")) {
Integer value1 = (int)(v1.toString().charAt(0));
Integer value2 = (int)(v2.toString().charAt(0));
return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
}
else if(typeName.endsWith("int") || typeName.endsWith("integer")) {
Integer value1 = Integer.parseInt(v1.toString());
Integer value2 = Integer.parseInt(v2.toString());
return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
}
else if(typeName.endsWith("long")) {
Long value1 = Long.parseLong(v1.toString());
Long value2 = Long.parseLong(v2.toString());
return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
}
else if(typeName.endsWith("float")) {
Float value1 = Float.parseFloat(v1.toString());
Float value2 = Float.parseFloat(v2.toString());
return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
}
else if(typeName.endsWith("double")) {
Double value1 = Double.parseDouble(v1.toString());
Double value2 = Double.parseDouble(v2.toString());
return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
}
else if(typeName.endsWith("boolean")) {
Boolean value1 = Boolean.parseBoolean(v1.toString());
Boolean value2 = Boolean.parseBoolean(v2.toString());
return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
}
else if(typeName.endsWith("date")) {
Date value1 = (Date)(v1);
Date value2 = (Date)(v2);
return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
}
else if(typeName.endsWith("timestamp")) {
Timestamp value1 = (Timestamp)(v1);
Timestamp value2 = (Timestamp)(v2);
return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
}
else {
//调用对象的compareTo()方法比较大小
Method method = field.getType().getDeclaredMethod("compareTo", new Class[]{field.getType()});
method.setAccessible(true); //设置可访问权限
int result = (Integer)method.invoke(v1, new Object[]{v2});
return ASC_order ? result : result*(-1);
}
}
catch (Exception e) {
String err = e.getLocalizedMessage();
System.out.println(err);
e.printStackTrace();
} return 0; //未知类型,无法比较大小
}
});
}
对List对象按照某个成员变量进行排序的更多相关文章
- 福利->KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型
我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型 ...
- CWnd和HWND的区别(hWnd只是CWnd对象的一个成员变量,代表与这个对象绑定的窗口)
所有控件类都是CWnd类的派生类,CWnd的所有成员函数在控件类中都可以使用.在MFC中,CWnd类是一个很重要的类,它封装了Windows的窗口句柄HWND.在Windows编程中, ...
- java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况
/* 样例1: class Parent{ int num = 3; } class Child extends Parent{ int num = 4; } */ /* 样例2: class Par ...
- C++(三十二) — 常对象、常成员变量、常成员函数
常量:对于既需要共享.又需要防止改变的数据.在程序运行期间不可改变. const 修饰的是对象中的 this 指针.所以不能被修改. 1.常对象 数据成员值在对象的整个生存期内不能改变.在定义时必须初 ...
- [C++] 所有该类的对象共享静态类成员变量
问:智能指针可以对指针的引用数量进行计数,一个智能指针释放时,别的智能指针怎么知道的? 同一类的对象共享同一变量最简单的方法是静态变量: 不像普通的变量,静态成员变量是被所有类对象共享的,不同的对象可 ...
- 41-ssm中对象查找正确但是没有将数据库中某个属性值赋给对象的一个成员变量
原因: 变量名虽然与 数据库字段一致,但是 包含下划线,如: a_b,数据库确实也是a_b: 但是ssm开启驼峰命名了,就要将变量名改为 aB , 驼峰命名就可以了.
- ①创建项目testpackage ②在pack2.B中添加方法f ③在类A中添加如下三个成员变量:int型的私有变量i float型的变量f double型的公有变量d 在pack1.B的main方法中为对象a的成员变量f和d分别赋值为2和3 在pack2.C的main方法中为对象a的成员变量d赋值为3
package pack1; public class A { private int i; float f; public double d; public float getF() { retur ...
- java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。
//------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...
- C++编译器是如何管理类和对象的,类的成员函数和成员变量
C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类.从计算机的角度,程序依然由数据段(栈区内存)和代码段(代码区内存)构成. #include ...
随机推荐
- Power Strings(kmp妙解)
Power Strings Time Limit : 6000/3000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Tota ...
- [每日一题] 11gOCP 1z0-052 :2013-09-19 创建用户...................................................B41
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/11834661 正确答案:BC 这道题比较简单,我就以答案来解析,如下来自官方文档创建用户的 ...
- XP用户:消除误解,大胆拥抱Linux
4月23日.知名家评论家Silviu Stahie发表文章.题为"Windows Users and Their Misconceptions About Linux". ...
- 【十分不错】【离线+树状数组】【TOJ4105】【Lines Counting】
On the number axis, there are N lines. The two endpoints L and R of each line are integer. Give you ...
- 【单调队列】【3-21个人赛】【problmeB】
Problem B Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Sub ...
- 页面样式base.css
下面是我用过多次的base.css.欢迎各种建议吐槽.大家共同进步. ;;} table{;} fieldset,img {;} address,caption, cite,code,dfn,em,s ...
- UVA 1569 Multiple
题意: 给定m个1位数字,要求用这些数字组成n的倍数的最小数字,如果无法组成就输出0 分析: BFS,由于n最大5000,余数最多5000,利用余数去判重,并记录下路径即可 代码: #include ...
- 献给写作者的 Markdown 新手指南
「简书」作为一款「写作软件」在诞生之初就支持了 Markdown,Markdown 是一种「电子邮件」风格的「标记语言」,我们强烈推荐所有写作者学习和掌握该语言.为什么?可以参考: 『为什么作家应该用 ...
- SVN(一次检出&二次检出)
一次检出: >进入经历文件夹 >输入svn checkout指令 >输入电脑密码 >输入用户名 >输入密码 >检出成功 第二次检出: >进入小涛文件夹 > ...
- iOS极光推送
昨天花了一下午的时间研究了下极光推送,也前也是没做过,不知道从何下手!才开始的时候一看官方的SDK感觉好难,不过经过一系列的捣鼓之后,手机收到了推送信息,感觉其实并没有那么难! 1.配置开发证书(得有 ...