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/*等于*/;
        }
    }
复制代码
扫描二维码关注公众号,回复: 3008602 查看本文章

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

转自:https://www.cnblogs.com/huangwei520/p/4868934.html

猜你喜欢

转载自blog.csdn.net/u013651026/article/details/82019161
今日推荐