资讯专栏INFORMATION COLUMN

Java对象集合万能排序封装

zlyBear / 2969人阅读

摘要:前言直接进入正题,闲的没事把对对象集合排序进行了封装,写起来优雅一点,不用每次用的时候自己再一个比较器对象了。

前言

直接进入正题,闲的没事把Java对对象集合排序进行了封装,写起来优雅一点,不用每次用的时候自己再new一个比较器对象了。

ListOrderUtil

没多少东西,就是下边这点代码!

import java.lang.reflect.Field;
import java.util.*;

public class ListOrderUtil {
    private List mArrayList;//数据集合
    private LinkedHashMap mOrderList = new LinkedHashMap<>();//所有的排序字段
    private Class mClass;//当天T的Class
    public static int ORDER_ASC = 1;//正序排列
    public static int ORDER_DESC = 2;//倒序排列

    public ListOrderUtil(List arrayList, Class tClass) {
        this.mArrayList = arrayList;
        this.mClass = tClass;
    }

    /**
     * 设置排序字段(按照设置的先后顺序对其进行排序)
     *
     * @param fieldName    字段名称
     * @param orderPattern 排序模式
     * @return
     */
    public ListOrderUtil setOrderField(String fieldName, int orderPattern) {
        this.mOrderList.put(fieldName, orderPattern);
        return this;
    }

    /**
     * 对数据集合进行排序
     *
     * @return
     */
    public List order() {
        this.mArrayList.sort(new Comparator() {
            @Override
            public int compare(T o1, T o2) {
                Field field = null;
                int order = 0;
                for (Map.Entry item : mOrderList.entrySet()) {
                    try {
                        field = mClass.getDeclaredField(item.getKey());
                        field.setAccessible(true);
                        if (field == null) {
                            throw new NoSuchFieldException(item.getKey());
                        }
                        if (item.getValue() == ORDER_ASC) {
                            order = field.get(o1).toString().compareTo(field.get(o2).toString());
                        } else {
                            order = field.get(o2).toString().compareTo(field.get(o1).toString());
                        }
                        if (order != 0) {
                            return order;
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                return 0;
            }
        });
        return this.mArrayList;
    }


}
使用案例

首先是对象一枚!

import java.util.Comparator;

public class Students {
    private int studentId;
    private int age;
    private String studentName;

    public Students() {
    }

    public Students(int studentId, int age, String studentName) {
        this.studentId = studentId;
        this.age = age;
        this.studentName = studentName;
    }

    public int getStudentId() {
        return studentId;
    }

    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

}

先来看看不封装的时候如何排序:

大量的逻辑处理代码冗余......

public class Main {

    public static void main(String[] args) {

        //添加测试数据
        ArrayList students = new ArrayList<>();

        Students students1 = new Students(1001, 22, "djk");
        Students students2 = new Students(1002, 18, "xxh");
        Students students3 = new Students(1003, 31, "wyd");
        Students students4 = new Students(1002, 18, "wxz");
        Students students5 = new Students(1005, 19, "sxn");
        Students students6 = new Students(1004, 32, "ljc");

        students.add(students1);
        students.add(students2);
        students.add(students3);
        students.add(students4);
        students.add(students5);
        students.add(students6);
        //-------------不封装的写法----------------------------不堪入目啊!!!!
        //1、使用studentId正序排列
        Collections.sort(students, new Comparator() {
            @Override
            public int compare(Students o1, Students o2) {
                return o1.getStudentId() - o2.getStudentId();
            }
        });
        //2、使用studentId和age进行多字段排序,studentId正序为首,若想等便以age进行倒序排列。
        Collections.sort(students, new Comparator() {
            @Override
            public int compare(Students o1, Students o2) {
                int order = o1.getStudentId() - o2.getStudentId();
                if (order == 0) {
                    order = o2.getAge() - o1.getAge();
                }
                return order;
            }
        });
        //3、多字段排序
        Collections.sort(students, new Comparator() {
            @Override
            public int compare(Students o1, Students o2) {
                int order = o1.getStudentId() - o2.getStudentId();
                if (order == 0) {
                    order = o2.getAge() - o1.getAge();
                }
                if (order == 0) {
                    order = o2.getStudentName().compareTo(o1.getStudentName());
                }
                return order;
            }
        });

    }
}

再来看看封装后的:

舒服多了......

public class Main {

    public static void main(String[] args) {

        //添加测试数据
        ArrayList students = new ArrayList<>();

        Students students1 = new Students(1001, 22, "djk");
        Students students2 = new Students(1002, 18, "xxh");
        Students students3 = new Students(1003, 31, "wyd");
        Students students4 = new Students(1002, 18, "wxz");
        Students students5 = new Students(1005, 19, "sxn");
        Students students6 = new Students(1004, 32, "ljc");

        students.add(students1);
        students.add(students2);
        students.add(students3);
        students.add(students4);
        students.add(students5);
        students.add(students6);

        //排序使用
        ListOrderUtil listOrderUtil = new ListOrderUtil<>(students, Students.class);
        //1、使用studentId正序排列
        listOrderUtil.setOrderField("studentId", ListOrderUtil.ORDER_ASC).order();

        //2、使用studentId和age进行多字段排序,studentId正序为首,若想等便以age进行倒序排列。
        listOrderUtil.setOrderField("studentId", ListOrderUtil.ORDER_ASC)
                .setOrderField("age", ListOrderUtil.ORDER_DESC);

        //3、多字段排序
        listOrderUtil.setOrderField("studentId", ListOrderUtil.ORDER_ASC)
                .setOrderField("age", ListOrderUtil.ORDER_DESC)
                .setOrderField("studentName", ListOrderUtil.ORDER_DESC)
                .order();
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77860.html

相关文章

  • java学习(七) —— API集合

    摘要:集合类主要负责保存盛装其他数据,因此集合类也被称为容器类。所有的集合类都位于包下。表示一组对象,这些对象也称为的元素。成员方法把集合转成数组迭代器,集合的专用遍历方式之接口概述有序的,也称为序列。 前言 在编程中,常常需要集中存放多个数据。从传统意义上讲,数组是我们的一个很好的选择,前提是我们实现已经明确知道我们将要保存的对象的数量。 一旦在数组初始化时指定了数组长度,这个数组长度就...

    senntyou 评论0 收藏0
  • 方法和数组就是这么简单!

    摘要:数组就是一个简单的线性序列,这使得元素访问非常快速。堆区堆内存用来存放创建的对象和数组。堆内存中的实体不再被指向时,启动垃圾回收机制,自动清除,这也是优于的表现之一中需要程序员手动清除。 showImg(https://segmentfault.com/img/remote/1460000019264541?w=600&h=242); 第三章 方法和数组 3.1 概述 还记得我们的He...

    darkerXi 评论0 收藏0
  • Java™ 教程(集合接口)

    集合接口 核心集合接口封装了不同类型的集合,如下图所示,这些接口允许独立于其表示的细节来操纵集合,核心集合接口是Java集合框架的基础,如下图所示,核心集合接口形成层次结构。 showImg(https://segmentfault.com/img/bVbntJW?w=402&h=146); Set是一种特殊的Collection,SortedSet是一种特殊的Set,依此类推,另请注意,层次结构...

    elisa.yang 评论0 收藏0
  • Java013-集合

    摘要:集合框架重点理解用于存储数据的容器。集合容器在不断向上抽取过程中。出现了集合体系。,删除将集合中的元素全删除,清空集合。删除集合中指定的对象。注意删除成功,集合的长度会改变。作用用于取集合中的元素。是集合特有的迭代器。是单列集合是双列集合 集合框架(重点理解):用于存储数据的容器。特点:1:对象封装数据,对象多了也需要存储。集合用于存储对象。2:对象的个数确定可以使用数组,但是不确定怎...

    qpal 评论0 收藏0
  • 工厂模式和“万能”工厂类

    摘要:如下工厂类文件我们可以发现,通过工厂类的包装,在调用工厂类方法构造对象时可以十分轻松地完成任务,而后面的其他任务则交由工厂类的静态代码块完成。因此我们考虑把这部分代码写入工厂类,再生产过程前进行判断,过程封装进工厂类。 需要构造一个类的对象,我们通常会用new的方法来构造: A a = new A(); 但是如果随着这个对象被创建的同时还必须进行其他相对复杂的操作,...

    LancerComet 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<