前提:

list中的元素是自定义对象,如何根据对象的元素进行排序呢?

比如List<Student>students 是一个list,每个元素都是Student对象,Student对象中有成员变量name,age,等,

那么我想根据age来排序,如何实现呢?

1,使用Comparator 接口

Student类 结构如下:(省略getter,setter方法)

  1. public class Student {
  2. /***
  3. * 姓名
  4. */
  5. private String name;
  6. private int age;
  7. private String address;
  8. /***
  9. * 考试得分
  10. */
  11. private int score;
  12.  
  13. //省略getter,setter方法
  14. @Override
  15. public String toString() {
  16. return "Student [name=" + name + ", age=" + age + ", score=" + score
  17. + "]";
  18. }
  19.  
  20. }

测试方法:

  1. @Test
  2. public void test_ListComparator(){
  3. List<Student>students=new ArrayList<Student>();
  4. Student stu=null;
  5. stu=new Student();
  6. stu.setName("whuang");
  7. stu.setAge(12);
  8. stu.setScore(80);
  9. students.add(stu);
  10.  
  11. stu=new Student();
  12. stu.setName("rong");
  13. stu.setAge(11);
  14. stu.setScore(90);
  15. students.add(stu);
  16.  
  17. stu=new Student();
  18. stu.setName("zhu");
  19. stu.setAge(15);
  20. stu.setScore(100);
  21. students.add(stu);
  22.  
  23. Collections.sort(students,new SystemHWUtil. ListComparator(true,"age"));
  24. System.out.println(students);
  25.  
  26. }

运行结果:

[Student [name=rong, age=11, score=90], Student [name=whuang, age=12, score=80], Student [name=zhu, age=15, score=100]]

核心类:

  1. public static class ListComparator implements Comparator{
  2. /***
  3. * 是否转化为Int之后再比较
  4. */
  5. private boolean isConvertInteger;
  6. /***
  7. * 对哪个列进行排序
  8. */
  9. private String comparedProperty;
  10. public ListComparator(boolean isConvertInteger,String comparedProperty) {
  11. super();
  12. this.isConvertInteger = isConvertInteger;
  13. this.comparedProperty=comparedProperty;
  14. }
  15. public int compare(Object o1, Object o2) {
  16. if(null!=o1&&null!=o2)
  17. {
  18. try {
  19. Object obj1=ReflectHWUtils.getObjectValue(o1, comparedProperty);
  20. Object obj2=ReflectHWUtils.getObjectValue(o2, comparedProperty);
  21. if(isConvertInteger){
  22. int num1;
  23. int num2;
  24. if(obj1 instanceof Integer){
  25. num1=(Integer)obj1;
  26. num2=(Integer)obj2;
  27. }else{
  28. num1=Integer.parseInt(obj1.toString());
  29. num2=Integer.parseInt(obj2.toString());
  30. }
  31. if(num1>num2){
  32. return 1;
  33. }else if(num1<num2){
  34. return -1;
  35. }else{
  36. return 0;
  37. }
  38. }else{
  39. return obj1.toString().compareTo(obj2.toString());
  40. }
  41. } catch (SecurityException e) {
  42. e.printStackTrace();
  43. } catch (NoSuchFieldException e) {
  44. e.printStackTrace();
  45. } catch (IllegalArgumentException e) {
  46. e.printStackTrace();
  47. } catch (IllegalAccessException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. return 0/*等于*/;
  52. }
  53. }

2,可以指定是升序还是降序

实例:

  1. @Test
  2. public void test_ListComparator(){
  3. List<Student>students=new ArrayList<Student>();
  4. Student stu=null;
  5. stu=new Student();
  6. stu.setName("whuang");
  7. stu.setAge(12);
  8. stu.setScore(80);
  9. students.add(stu);
  10.  
  11. stu=new Student();
  12. stu.setName("rong");
  13. stu.setAge(11);
  14. stu.setScore(90);
  15. students.add(stu);
  16.  
  17. stu=new Student();
  18. stu.setName("zhu");
  19. stu.setAge(15);
  20. stu.setScore(100);
  21. students.add(stu);
  22. SortList<Student> sortList = new SortList<Student>();
  23. sortList.Sort(students, "getAge", "asc");
  24. System.out.println(students);
  25.  
  26. }

注意:sortList.Sort 的第二个参数是方法名,不是成员变量名.

核心代码

  1. package com.common.util;
  2.  
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5. import java.util.Collections;
  6. import java.util.Comparator;
  7. import java.util.List;
  8.  
  9. public class SortList<E> {
  10. public void Sort(List<E> list, final String method, final String sort) {
  11. Collections.sort(list, new Comparator() {
  12. public int compare(Object a, Object b) {
  13. int ret = 0;
  14. try {
  15. Method m1 = ((E) a).getClass().getMethod(method, null);
  16. Method m2 = ((E) b).getClass().getMethod(method, null);
  17. if (sort != null && "desc".equals(sort))// 倒序
  18. ret = m2.invoke(((E) b), null).toString()
  19. .compareTo(m1.invoke(((E) a), null).toString());
  20. else
  21. // 正序
  22. ret = m1.invoke(((E) a), null).toString()
  23. .compareTo(m2.invoke(((E) b), null).toString());
  24. } catch (NoSuchMethodException ne) {
  25. System.out.println(ne);
  26. } catch (IllegalAccessException ie) {
  27. System.out.println(ie);
  28. } catch (InvocationTargetException it) {
  29. System.out.println(it);
  30. }
  31. return ret;
  32. }
  33. });
  34. }
  35. }

参考:

http://hw1287789687.iteye.com/blog/2223537

java 对list进行排序的更多相关文章

  1. Java内存访问重排序笔记

    >>关于重排序 重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段. 重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境. > ...

  2. Java线性表的排序

    Java线性表的排序 ——@梁WP 前言:刚才在弄JDBC的时候,忽然觉得order-by用太多了没新鲜感,我的第六感告诉我java有对线性表排序的封装,然后在eclipse里随便按了一下“.” ,哈 ...

  3. java数组降序排序之冒泡排序

    import java.util.Arrays;//必须加载 class Demo{ public static void main(String []args){ int[] arr={3,54,4 ...

  4. java中的选择排序之降序排列

    import java.util.Arrays;//必须加载 class Demo{ public static void main(String []args){ int[] arr={3,54,4 ...

  5. Java 多条件复杂排序小结

    前言 今天下午做了拼多多在牛客网上的在线笔试题,感觉自己的智商被鄙视到了···不过其中一道题的某一部分引起了我极大的兴趣,感觉可以总结一下,做好积累~ 题目的部分我拍照如下所示 这里面最复杂的就是第3 ...

  6. Java基础-数组常见排序方式

    Java基础-数组常见排序方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数据的排序一般都是生序排序,即元素从小到大排列.常见的有两种排序方式:选择排序和冒泡排序.选择排序的特 ...

  7. Java实现各种内部排序算法

    数据结构中常见的内部排序算法: 插入排序:直接插入排序.折半插入排序.希尔排序 交换排序:冒泡排序.快速排序 选择排序:简单选择排序.堆排序 归并排序.基数排序.计数排序 直接插入排序: 思想:每次将 ...

  8. Java ArrayList的不同排序方法

    本文由 ImportNew - 温布利往事 翻译自 dzone.欢迎加入翻译小组.转载请见文末要求. 由于其功能性和灵活性,ArrayList是 Java 集合框架中使用最为普遍的集合类之一.Arra ...

  9. Java 的八种排序算法

    Java 的八种排序算法 这个世界,需要遗忘的太多. 背景:工作三年,算法一问三不知. 一.八种排序算法 直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序.归并排序和基数排序. 二.算 ...

  10. java中Collections.sort排序详解

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f, ...

随机推荐

  1. centos7 安装php5.6.0 、nginx1.7.4、phpssdbadmin

    1 创建用户.网站目录和下载相关的安装包 groupadd www #添加www组 创建目录/data/www/ chown www:www /data/www/ -R #设置目录所有者 chmod ...

  2. 8第八章CTE递归及分组汇总高级部分(多维数据集)(转载)

    8第八章CTE递归及分组汇总高级部分(多维数据集) 这里贴图太麻烦...算了 UNION 等集合操作符: UNION 等以第一个 SELECT  的 列明 作为 整个结果集的列明,整个结果集 唯一认可 ...

  3. iOS Core Animation学习总结(1)--CALayer常用属性

    图层是core animation的基础, UIView之所以能显示在屏幕上,靠的是其内部的这个图层,即每个UIView 都有 CALayer,可通过UIView.layer或者[UIView lay ...

  4. 【html】【0】开始的序言

    人生总得做点什么才显得有意义,在牛逼的梦想也抵挡不住你傻逼似的坚持! 1>本系列适用于没有任何计算机语言基础的小白入门级教程 2>为了我喜欢的一个女生小娜娜 3>为自己系统的学习ht ...

  5. go和swift

    你生命中的有些东西终究会失去,比如我住了6年的陈寨,这个聚集了郑州十几万IT民工的地方,说拆就拆了.再比如我玩了3年的坦克英雄,这个带给我太多快乐的游戏,说停就停了. 编程对我而言是种爱好,我上学6年 ...

  6. transcode_step()在转码过程中对pts、dts、duration的处理

    对pts.dts.duration的处理主要集中在两大函数里面 1.process_input()读入数据并处理,放到滤镜里面 2.reap_filters()从滤镜读出数据,处理后写入文件 proc ...

  7. iPhone分辨率

    分辨率和像素 1.iPhone5           4"     分辨率320x568,像素640x1136,@2x 2.iPhone6           4.7"  分辨率3 ...

  8. paramiko学习

    1. ssh简介 2. ssh私有key/共有key的区别 3. paramiko的常规使用

  9. Python快速排序

    快排,取一个key值,一般取第一个即可,将小于key的放到左边,大于key的放到右边,递归实现 import random def quicksort(data, low = 0, high = No ...

  10. xadmin的插件机制

    xadmin的视图方法中如果加了@filter_hook 标记的都可以作为插件的钩子函数. 例如在ListAdminView类中有许多加了上述标记的方法, @filter_hook def get_c ...