1. /**
  2. * 对List对象按照某个成员变量进行排序
  3. * @param list List对象
  4. * @param sortField 排序的属性名称
  5. * @param sortMode 排序方式:ASC,DESC 任选其一
  6. */
  7. public static <T> void sortList(List<T> list, final String sortField, final String sortMode) {
  8. Collections.sort(list, new Comparator<T>() {
  9. @Override
  10. public int compare(T o1, T o2) {
  11. try {
  12. Class clazz = o1.getClass();
  13. Field field = clazz.getDeclaredField(sortField); //获取成员变量
  14. field.setAccessible(true); //设置成可访问状态
  15. String typeName = field.getType().getName().toLowerCase(); //转换成小写
  16.  
  17. Object v1 = field.get(o1); //获取field的值
  18. Object v2 = field.get(o2); //获取field的值
  19.  
  20. boolean ASC_order = (sortMode == null || "ASC".equalsIgnoreCase(sortMode));
  21.  
  22. //判断字段数据类型,并比较大小
  23. if(typeName.endsWith("string")) {
  24. String value1 = v1.toString();
  25. String value2 = v2.toString();
  26. return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
  27. }
  28. else if(typeName.endsWith("short")) {
  29. Short value1 = Short.parseShort(v1.toString());
  30. Short value2 = Short.parseShort(v2.toString());
  31. return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
  32. }
  33. else if(typeName.endsWith("byte")) {
  34. Byte value1 = Byte.parseByte(v1.toString());
  35. Byte value2 = Byte.parseByte(v2.toString());
  36. return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
  37. }
  38. else if(typeName.endsWith("char")) {
  39. Integer value1 = (int)(v1.toString().charAt(0));
  40. Integer value2 = (int)(v2.toString().charAt(0));
  41. return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
  42. }
  43. else if(typeName.endsWith("int") || typeName.endsWith("integer")) {
  44. Integer value1 = Integer.parseInt(v1.toString());
  45. Integer value2 = Integer.parseInt(v2.toString());
  46. return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
  47. }
  48. else if(typeName.endsWith("long")) {
  49. Long value1 = Long.parseLong(v1.toString());
  50. Long value2 = Long.parseLong(v2.toString());
  51. return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
  52. }
  53. else if(typeName.endsWith("float")) {
  54. Float value1 = Float.parseFloat(v1.toString());
  55. Float value2 = Float.parseFloat(v2.toString());
  56. return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
  57. }
  58. else if(typeName.endsWith("double")) {
  59. Double value1 = Double.parseDouble(v1.toString());
  60. Double value2 = Double.parseDouble(v2.toString());
  61. return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
  62. }
  63. else if(typeName.endsWith("boolean")) {
  64. Boolean value1 = Boolean.parseBoolean(v1.toString());
  65. Boolean value2 = Boolean.parseBoolean(v2.toString());
  66. return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
  67. }
  68. else if(typeName.endsWith("date")) {
  69. Date value1 = (Date)(v1);
  70. Date value2 = (Date)(v2);
  71. return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
  72. }
  73. else if(typeName.endsWith("timestamp")) {
  74. Timestamp value1 = (Timestamp)(v1);
  75. Timestamp value2 = (Timestamp)(v2);
  76. return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
  77. }
  78. else {
  79. //调用对象的compareTo()方法比较大小
  80. Method method = field.getType().getDeclaredMethod("compareTo", new Class[]{field.getType()});
  81. method.setAccessible(true); //设置可访问权限
  82. int result = (Integer)method.invoke(v1, new Object[]{v2});
  83. return ASC_order ? result : result*(-1);
  84. }
  85. }
  86. catch (Exception e) {
  87. String err = e.getLocalizedMessage();
  88. System.out.println(err);
  89. e.printStackTrace();
  90. }
  91.  
  92. return 0; //未知类型,无法比较大小
  93. }
  94. });
  95. }

对List对象按照某个成员变量进行排序的更多相关文章

  1. 福利->KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型

    我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型 ...

  2. CWnd和HWND的区别(hWnd只是CWnd对象的一个成员变量,代表与这个对象绑定的窗口)

            所有控件类都是CWnd类的派生类,CWnd的所有成员函数在控件类中都可以使用.在MFC中,CWnd类是一个很重要的类,它封装了Windows的窗口句柄HWND.在Windows编程中, ...

  3. java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况

    /* 样例1: class Parent{ int num = 3; } class Child extends Parent{ int num = 4; } */ /* 样例2: class Par ...

  4. C++(三十二) — 常对象、常成员变量、常成员函数

    常量:对于既需要共享.又需要防止改变的数据.在程序运行期间不可改变. const 修饰的是对象中的 this 指针.所以不能被修改. 1.常对象 数据成员值在对象的整个生存期内不能改变.在定义时必须初 ...

  5. [C++] 所有该类的对象共享静态类成员变量

    问:智能指针可以对指针的引用数量进行计数,一个智能指针释放时,别的智能指针怎么知道的? 同一类的对象共享同一变量最简单的方法是静态变量: 不像普通的变量,静态成员变量是被所有类对象共享的,不同的对象可 ...

  6. 41-ssm中对象查找正确但是没有将数据库中某个属性值赋给对象的一个成员变量

    原因: 变量名虽然与 数据库字段一致,但是 包含下划线,如: a_b,数据库确实也是a_b: 但是ssm开启驼峰命名了,就要将变量名改为   aB , 驼峰命名就可以了.

  7. ①创建项目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 ...

  8. java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。

    //------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...

  9. C++编译器是如何管理类和对象的,类的成员函数和成员变量

    C++中的class从面向对象理论出发,将变量(属性)和函数(方法)集中定义在一起,用于描述现实世界中的类.从计算机的角度,程序依然由数据段(栈区内存)和代码段(代码区内存)构成. #include ...

随机推荐

  1. 有一种设计风格叫RESTful

    一 前言 刚看了<RESTful Web APIs中文版>.试读了前两章. 每本书的第一章都是抽象得不得了,是整本书的总结:开篇说基础有点简单,从教你怎么向地址栏输入地址訪问网页開始(某人 ...

  2. C++ 顶层 const

    我的主力博客:半亩方塘 本文的主要參考来源来自于:C++ Primer 中文版(第 5 版) 第 57 面至第 58 面 1. 顶层 const 与底层 const 概念 我们知道,指针本身是一个对象 ...

  3. java 命令行制定logback参数

    -Dlogback.configurationFile=file:///export/Workspace/apache-cassandra/apache-cassandra-main/target/b ...

  4. 前端资料QQ群交流

    转:https://github.com/jsfront/src/blob/master/qq.md 这本来是我QQ群内部的一份公共约定的日常交流规则,后来得到大伙的一致认可,并用实际行动来捍卫它,使 ...

  5. linux遇见的问题

    我在/usr 文件夹下把hadoop-1.2.1文件夹改名为hadoop,不过hadoop已经存在了.这样就覆盖了.可是课件被占用了,可见没有真的删除掉. 怎么把消失的hadoop真正删除呢?

  6. 点击TextView浏览器打开指定网页

    直接上代码: /** * 点击跳转到版权页面 */ private void getCopyRight() { // TODO Auto-generated method stub TextView ...

  7. 【转】这些隐藏在苹果iPhone当中的内置代码你是否知道?

    原文地址:http://www.ithome.com/html/iphone/200569.htm 每一部手机都有一些内置的隐藏代码,我们称之为“指令”,这些代码加在一起就叫做“指令集”.当然这些代码 ...

  8. Android ImageView图片自适应

    网络上下载下来的图片自适应:android:adjustViewBounds="true"(其详细解释在下面) <ImageView     android:id=" ...

  9. map循环

    Map<String,  String> maps = new HashMap<String, String>(); maps.put("_id", &qu ...

  10. Hive进阶(下)

    Hive进阶(下) Hive进阶(下) Hive的表连接 等值连接 查询员工信息:员工号.姓名.月薪.部门名称 1.select e.empno,e.ename,e.sal,d.dname2.from ...