前言

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

一、Comparable方式

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

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

这样实现了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;}@Overridepublic int compareTo(@NonNull HtspbListBean htspbListBean) {return this.spxh - htspbListBean.spxh;}}
}

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

List<ConDetailBean.INFOBean.HtspbListBean> mList = response.body().getINFO().getHtspbList();
Collections.sort(mList);

这样我们就完成了第一种方式的实现过程,接下来看第二种方式。

二、Comparator方式

1、简要介绍

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

注释: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;}@Overridepublic 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);

以上就是两种排序方法的介绍,总结下来,两种方式各有优劣,还是根据实际需要自行选择!

欢迎各位留言讨论!

Android数据排序之集合排序相关推荐

  1. java list 默认排序_List集合排序(默认及自定义排序)

    一.java提供的默认list排序方法 主要代码: List list = new ArrayList(); list.add("王硕"); list.add("刘媛媛& ...

  2. android 二级列表拖动排序_Excel的数据透视表六种排序方法

    Excel的数据透视表排序不像表格中那样操作灵活,很多小伙伴对此不熟悉,本文系统讲解数据透视表的各种排序. 一.常规排序 二.组内排序 三.多关键字排序 四.手动拖动排序 五.手动输入排序 六.设置透 ...

  3. android 通讯录字母排序,Android仿微信联系人字母排序效果

    本文实例为大家分享了Android联系人字母排序的具体代码,供大家参考,具体内容如下 实现思路:首先说下布局,整个是一个相对布局,最下面是一个listview,listview上面是一个自定义的vie ...

  4. Android实现中文汉字笔划(笔画)、中文拼音排序、英文排序

    发布时间:2018-11-16 技术:Android 概述 最近要做一个类似微信的,在登录界面选择国家地区的功能,微信有中文汉字笔画排序以及中文拼音排序等几种方式,如下所示: 简体中文 拼音排序;繁体 ...

  5. java map 排序_java集合框架面试题大集合

    1.介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)[基础] 答:Collection FrameWork 如下: Collection: ├List │├Link ...

  6. 为集合排序的三个方法

    // 为集合字符串排序(cmpare:) // - null :空类型  就是字符型的0: // - [NSNull null]是对象类型,能够存入集合的数据:为其分配了内存,但其中的值为空(不能被排 ...

  7. java8新特性:对map集合排序

    一.简单介绍Map 在讲解Map排序之前,我们先来稍微了解下map,map是键值对的集合接口,它的实现类主要包括:HashMap, TreeMap, Hashtable以及LinkedHashMap等 ...

  8. HDU1412 {A} + {B}【排序+集合合并】

    {A} + {B} Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  9. list集合排序_Java面试第七部分 Java的集合

    7.1. HashMap排序题 已知一个 HashMap<Integer,User>集合, User 有 name(String)和 age(int)属性.请写一个方法实现对HashMap ...

  10. 使用stream流进行集合排序取最大值,根据集合中的bigdemal属性排序(正序反序)并取最大值

    业务: 求折线图的UPH图相关数据,前端动态修改纵轴的峰值,需要后端获取最大值 1)根据集合某个属性(业务以bigdecimal数据为例)进行集合排序,包括升序反序 2)根据集合的某个number数值 ...

最新文章

  1. 系统架构设计_系统工程师--系统架构设计
  2. zzuli oj 1167逆转数(指针专题)
  3. 新建notebook时发现在notebook里的sys.path与电脑上不一样
  4. linux常用命令--diff
  5. Python time asctime()方法
  6. EF---延迟加载技术
  7. Windows中木马之后桌面被篡改的恢复方法
  8. keystore是个嘛东西
  9. python 用selenium自动启动百度并搜索关键词
  10. Vue-router路由使用,单页面的实现
  11. 发布CHM文档生成器 可替代 HTML Help Workshop,有全部C#源代码
  12. 单链表的逆置-C++实现(ok)
  13. MQTT的学习研究(十三) IBM MQTTV3 简单发布订阅实例
  14. 清华大学操作系统OS学习(十四)——文件系统和文件描述符
  15. 根据二次曲面模型法建立区域高程异常拟合模型
  16. 【机器学习】K-means算法Python实现教程
  17. 关于android属性persistent的问题
  18. mysql char archer_mysql - 常用sql
  19. 移动硬盘linux系统安装win7系统,超简单的移动硬盘安装系统win7教程
  20. #10019. 「一本通 1.3 例 2」生日蛋糕

热门文章

  1. messenger支持查找附近的人功能吗_玩微信,附近的人,是否双方都在查找附近的人,才能显示?...
  2. OPPO K9 Pro刷root强解锁BL刷面具Magisk框架 oppo k9pro root教程
  3. java--实现j2cache二级缓存
  4. Artnet对话孙宇晨:做自己的偶像
  5. Vue2.0安装教程
  6. Postman的安装
  7. 说说“用户无线网络时不时断开重连”的故障!
  8. springboot简历制作
  9. intel h61 linux驱动下载,IntelIntel DH61AG BIOS 0022.BI主板驱动官方正式版下载,适用于dos-驱动精灵...
  10. 工程项目管理(EPC)系统全套流程详细解读(含流程图)