Android数据排序之集合排序

时间:2021-10-31 19:27:25

前言

最近在写项目时遇到这样一个问题,后台接口返回的一个审批流程List集合中的数据顺序是乱序的,但是为了和PC前端在显示上保持一致,所以只能自己排序。一般这种情况都是可以根据集合中对应实体对象中的某一个属性去进行升序或者降序排列的。关于排序的处理方法,基本上都是Java基础中的内容,说实话一开始还真是记不太清了,基础掌握的太不牢靠了,吓的我赶紧去翻了翻《Java核心技术》,又重新对这一块内容做了一个回顾。这里我们可以使用ComparableComparator两种方式去实现排序,我在项目中使用的是第二种,个人觉得它的可定制性和灵活性更好一些。接下来会分别对两种方式做一个简单的总结。

一、Comparable方式

1、简要介绍(部分内容截取自《Java核心技术 卷I 基础知识》)

使用Comparable方式实现排序必须要满足一个前提条件:对象所属的类必须实现了Comparable接口,任何实现了Comparable接口的类都必须重写compareTo()方法,这个方法在最初的时候参数是一个Object对象,返回一个整形数值,之后的话这个接口已经改进为泛型类型。接口定义如下:

Android数据排序之集合排序

这样实现了Comparable接口的类对象的集合或者数组可以通过Collections.sort或者Arrays.sort进行自动排序。

2、代码实战

首先看数据实体,这个类实现了Comparable接口,泛型传入本类对象,并且重写了compareTo方法,返回值为整型数据:

public static class HtspbListBean implements Comparable<HtspbListBean>{

        private String htbh;
        private int splbdm;
        private int spxh;
        private String spbz;
        private Object spr;
        private Object sprq;
        private Object spyj;
        private String gsdm;
        private int jsdm;

        public String getHtbh() {
            return htbh;
        }

        public void setHtbh(String htbh) {
            this.htbh = htbh;
        }

        public int getSplbdm() {
            return splbdm;
        }

        public void setSplbdm(int splbdm) {
            this.splbdm = splbdm;
        }

        public int getSpxh() {
            return spxh;
        }

        public void setSpxh(int spxh) {
            this.spxh = spxh;
        }

        public String getSpbz() {
            return spbz;
        }

        public void setSpbz(String spbz) {
            this.spbz = spbz;
        }

        public Object getSpr() {
            return spr;
        }

        public void setSpr(Object spr) {
            this.spr = spr;
        }

        public Object getSprq() {
            return sprq;
        }

        public void setSprq(Object sprq) {
            this.sprq = sprq;
        }

        public Object getSpyj() {
            return spyj;
        }

        public void setSpyj(Object spyj) {
            this.spyj = spyj;
        }

        public String getGsdm() {
            return gsdm;
        }

        public void setGsdm(String gsdm) {
            this.gsdm = gsdm;
        }

        public int getJsdm() {
            return jsdm;
        }

        public void setJsdm(int jsdm) {
            this.jsdm = jsdm;
        }

        @Override
        public int compareTo(@NonNull HtspbListBean htspbListBean) {
            return this.spxh - htspbListBean.spxh;
        }
    }
}
Android数据排序之集合排序

在我们做完上述操作,并且拿到源数据集之后,我们就可以调用Collections.sort方法进行排序了:

List<ConDetailBean.INFOBean.HtspbListBean> mList = response.body().getINFO().getHtspbList();
Collections.sort(mList);
这样我们就完成了第一种方式的实现过程,接下来看第二种方式。

二、Comparator方式

1、简要介绍

Comparator这个类没有实现Comparable接口,所以它本身不支持排序,所以需要创建一个比较器,在这个比较器的内部实现排序的逻辑,因为Comparator也是一个接口,所以我们需要创建一个类去实现这个接口,也就是说,这个自定义的比较器就是Comparator的实现类,接口定义如下:

Android数据排序之集合排序

注释:1、若一个类要实现Comparator接口,它一定要实现compare(T o1, T o2)函数,但可以不实现 equals(Object obj) 函数。
   2、int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

2、代码实战

我这里新建一个类HtspComparator实现我们的Comparator接口,泛型传入我们的实体类对象,并且在这里做了一个拓展,在这个类的构造函数中传入一个type,这个type用来控制我们的排序规则,规定:1为降序,2为升序,这样可以动态的设定排序规则,灵活性更高。来看具体代码:

private class HtspComparator implements Comparator<ConDetailBean.INFOBean.HtspbListBean>{
    private String type;

    HtspComparator(String type){
        this.type = type;
    }

    @Override
    public int compare(ConDetailBean.INFOBean.HtspbListBean h1, ConDetailBean.INFOBean.HtspbListBean h2) {
        if (type.equals("1")){ //降序
            return h2.getSpxh() - h1.getSpxh();
        }else { //升序
            return h1.getSpxh() - h2.getSpxh();
        }
    }
}
在我们自定义完了比较器之后,我们通过去new出它的实例,就可以进行排序了,代码和第一种方式比较类似,只是调用了重载了双参的Collections.sort方法:

List<ConDetailBean.INFOBean.HtspbListBean> mList = response.body().getINFO().getHtspbList();
Comparator<ConDetailBean.INFOBean.HtspbListBean> com = new HtspComparator("2");
Collections.sort(mList,com);
以上就是两种排序方法的介绍,总结下来,两种方式各有优劣,还是根据实际需要自行选择!

欢迎各位留言讨论!