转载

java 对list进行排序

前提:

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

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

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

1,使用Comparator 接口

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

public class Student {     /***      * 姓名      */     private String name;     private int age;     private String address;     /***      * 考试得分      */     private int score;  //省略getter,setter方法     @Override     public String toString() {         return "Student [name=" + name + ", age=" + age + ", score=" + score                 + "]";     }      }

测试方法:

@Test public void test_ListComparator(){  List<Student>students=new ArrayList<Student>();  Student stu=null;  stu=new Student();  stu.setName("whuang");  stu.setAge(12);  stu.setScore(80);  students.add(stu);  stu=new Student();  stu.setName("rong");  stu.setAge(11);  stu.setScore(90);  students.add(stu);  stu=new Student();  stu.setName("zhu");  stu.setAge(15);  stu.setScore(100);  students.add(stu);  Collections.sort(students,new SystemHWUtil. ListComparator(true,"age"));  System.out.println(students); } 

运行结果:

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

核心类:

public static class ListComparator implements Comparator{  /***   * 是否转化为Int之后再比较   */  private boolean isConvertInteger;  /***   * 对哪个列进行排序   */  private String comparedProperty;  public ListComparator(boolean isConvertInteger,String comparedProperty) {   super();   this.isConvertInteger = isConvertInteger;   this.comparedProperty=comparedProperty;  }  public int compare(Object o1, Object o2) {   if(null!=o1&&null!=o2)   {    try {     Object obj1=ReflectHWUtils.getObjectValue(o1, comparedProperty);     Object obj2=ReflectHWUtils.getObjectValue(o2, comparedProperty);     if(isConvertInteger){      int num1;      int num2;      if(obj1 instanceof Integer){       num1=(Integer)obj1;       num2=(Integer)obj2;      }else{       num1=Integer.parseInt(obj1.toString());       num2=Integer.parseInt(obj2.toString());      }      if(num1>num2){       return 1;      }else if(num1<num2){       return -1;      }else{       return 0;      }     }else{      return obj1.toString().compareTo(obj2.toString());     }    } catch (SecurityException e) {     e.printStackTrace();    } catch (NoSuchFieldException e) {     e.printStackTrace();    } catch (IllegalArgumentException e) {     e.printStackTrace();    } catch (IllegalAccessException e) {     e.printStackTrace();    }   }   return 0/*等于*/;  } } 

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

实例:

@Test public void test_ListComparator(){  List<Student>students=new ArrayList<Student>();  Student stu=null;  stu=new Student();  stu.setName("whuang");  stu.setAge(12);  stu.setScore(80);  students.add(stu);  stu=new Student();  stu.setName("rong");  stu.setAge(11);  stu.setScore(90);  students.add(stu);  stu=new Student();  stu.setName("zhu");  stu.setAge(15);  stu.setScore(100);  students.add(stu);  SortList<Student> sortList = new SortList<Student>();    sortList.Sort(students, "getAge", "asc");    System.out.println(students); } 

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

核心代码

package com.common.util; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collections; import java.util.Comparator; import java.util.List; public class SortList<E> {  public  void Sort(List<E> list, final String method, final String sort) {   Collections.sort(list, new Comparator() {    public int compare(Object a, Object b) {     int ret = 0;     try {      Method m1 = ((E) a).getClass().getMethod(method, null);      Method m2 = ((E) b).getClass().getMethod(method, null);      if (sort != null && "desc".equals(sort))// 倒序       ret = m2.invoke(((E) b), null).toString()         .compareTo(m1.invoke(((E) a), null).toString());      else       // 正序       ret = m1.invoke(((E) a), null).toString()         .compareTo(m2.invoke(((E) b), null).toString());     } catch (NoSuchMethodException ne) {      System.out.println(ne);     } catch (IllegalAccessException ie) {      System.out.println(ie);     } catch (InvocationTargetException it) {      System.out.println(it);     }     return ret;    }   });  } } 

参考:

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

正文到此结束
Loading...