• 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

  • 相关阅读:
    VMware安装centos7
    Docker Compose 启动mysql,redis,rabbitmq
    mysql升级到5.7
    Docker Compose搭建ELK
    Spring Boot源码(八):Spring AOP源码
    Spring AOP-基于@AspectJ风格
    JDK动态代理
    Spring Boot源码(七):循环依赖
    Spring Boot源码(六):Bean的创建详解
    Spring Boot源码(五):BeanFactoryPostProcessor和BeanPostProcessor
  • 原文地址:https://www.cnblogs.com/huangwei520/p/4868934.html
Copyright © 2020-2023  润新知