排序——升序降序的使用

前言

在做项目的过程中,偶尔会用到对集合中数据进行升序降序的排列问题,问题不是很难,但有时处理起来非常浪费时间,于是今天就把排序问题稍微处理了下,整理成一个排序工具类——CompareSortor

本文参考以下链接
Comparable、Comparator区别、Comparator升序降序实现
Collections 实现List简单升序降序 以及 各种用法
在此表示感谢。

今天讲解的内容涉及到:

  • Comparator比较大小的原理
  • list排序方法
  • CompareSortor使用的讲解

下面就来讲讲它的使用

一.Comparator比较大小的原理

先看一段代码:

                List<Integer> list = new ArrayList<>();
                list.add(1);
                list.add(9);
                list.add(3);
                list.add(7);
                Collections.sort(list, new Comparator<Integer>() {
                    @Override
                    public int compare(Integer t1, Integer t2) {
                        int i=0;
                        int compare=t1-t2;
                        if(compare>0){
                            i=1;
                        }else if(compare<0){
                            i=-1;
                        }
                        return i;
                    }
                });
                LogUtil.e(MainActivity.class,"======list==="+list.toString());

打印结果:

E/pei: MainActivity:======list===[1, 3, 7, 9]

以上是做一个list<Integer>集合的升序排列,用到Collections.sort(... , ....)方法,然后要实现Comparator接口,重写Comparator类中compare(Integer t1, Integer t2)方法,当按升序排列的时候,t1-t2>0返回1,t1-t2=0返回0,t1-t2<0返回-1

二.list排序方法
2.1Collections.sort(list),默认升序排列

代码如下:

 List<Integer> list = new ArrayList<>();
                list.add(1);
                list.add(9);
                list.add(3);
                list.add(7);
                Collections.sort(list);
                LogUtil.e(MainActivity.class,"======list==="+list.toString());

打印结果

E/pei: MainActivity:======list===[1, 3, 7, 9]
2.3Collections.sort(list),字母顺序排序

代码如下:

          List<String> list = new ArrayList<>();
                list.add("a");
                list.add("c");
                list.add("d");
                list.add("b");
                Collections.sort(list);
                LogUtil.e(MainActivity.class,"======list==="+list.toString());

打印结果

E/pei: MainActivity:======list===[a, b, c, d]
2.4Collections.sort(list),按汉字拼音升序排列

代码如下:

List<String> list = new ArrayList<>();
                list.add("我");
                list.add("和");
                list.add("你");
                list.add("他");
                Collections.sort(list, Collator.getInstance(java.util.Locale.CHINA));
                LogUtil.e(MainActivity.class,"======list==="+list.toString());

打印结果:

MainActivity:======list===[和, 你, 他, 我]
2.5Collections.reverse(list),逆向排序

将汉字数组按z-a的顺序排列:

                List<String> list = new ArrayList<>();
                list.add("我");
                list.add("和");
                list.add("你");
                list.add("他");
                Collections.sort(list, Collator.getInstance(java.util.Locale.CHINA));
                Collections.reverse(list);//反转整个数组
                LogUtil.e(MainActivity.class,"======list==="+list.toString());

打印结果:

E/pei: MainActivity:======list===[我, 他, 你, 和]
2.5Collections.reverse(list),数字降序

代码如下:

                List<Double> list = new ArrayList<>();
                list.add(5.7d);
                list.add(5.72d);
                list.add(6.33d);
                list.add(15.2d);
                Collections.sort(list);
                Collections.reverse(list);//反转整个数组
                LogUtil.e(MainActivity.class,"======list==="+list.toString());

打印结果

E/pei: MainActivity:======list===[15.2, 6.33, 5.72, 5.7]
2.6Collections.shuffle(list),随机排序
                List<Double> list = new ArrayList<>();
                list.add(5.7d);
                list.add(5.72d);
                list.add(6.33d);
                list.add(15.2d);
                Collections.shuffle(list);//随机排序
                LogUtil.e(MainActivity.class,"===1===list==="+list.toString());
                Collections.shuffle(list);//随机排序
                LogUtil.e(MainActivity.class,"===2===list==="+list.toString());

打印结果:

MainActivity:===1===list===[5.72, 6.33, 15.2, 5.7]
MainActivity:===2===list===[5.72, 15.2, 6.33, 5.7]
2.7Collections.rotate(List<T>list,int i);,循环移动

i大于0时表示向右移动,i小于0时表示向左移动
代码如下:

                List<String> list = Arrays.asList("大学","高中","初中","小学","幼儿园");
                Collections.rotate(list,1);//右移一位
                LogUtil.e(MainActivity.class,"===1===list==="+list.toString());
                List<String> list2 = Arrays.asList("大学","高中","初中","小学","幼儿园");
                Collections.rotate(list2,-2);//左移两位
                LogUtil.e(MainActivity.class,"===2===list==="+list2.toString());

打印结果:

MainActivity:===1===list===[幼儿园, 大学, 高中, 初中, 小学]
MainActivity:===2===list===[初中, 小学, 幼儿园, 大学, 高中]
2.8Collections.swap(List<T>list,int a,int b);,元素换位

a,b表示要相互换位的元素下标
代码如下:

List<String> list = Arrays.asList("大学","高中","初中","小学","幼儿园");
                Collections.swap(list,0,3);//
                LogUtil.e(MainActivity.class,"===1===list==="+list.toString());

打印结果:

MainActivity:===1===list===[小学, 高中, 初中, 大学, 幼儿园]
三.CompareSortor使用的讲解
3.1先给出一个对象model类Student

代码如下:

package com.android.model;

/**
 * Title:
 * Description:
 * <p>
 * Created by pei
 * Date: 2017/12/22
 */
public class Student extends BaseModel{

    private String name;
    private int age;

    public Student(){}

    public Student(String name,int age){
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

}

3.2 然后是排序工具类CompareSortor

代码如下:

package com.android.ui;

import com.android.util.CollectionUtil;
import com.android.util.StringUtil;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Title:排列工具类
 * Description:
 * <p>
 * Created by pei
 * Date: 2017/12/22
 */
public class CompareSortor<T> implements Comparator<T> {

    private String mFieldName;
    private boolean mReverse;//是否为降序排列,默认false

    private CompareSortor() {}

    private static class Holder {
        private static CompareSortor instance = new CompareSortor();
    }

    public static CompareSortor getInstance(){
        return CompareSortor.Holder.instance;
    }

    /**升序排列数值集合**/
    public List<T>sortList(List<T>list) {
        mReverse=false;
        return getFieldList(list);
    }

    /**升序排列对象集合**/
    public List<T>sortList(List<T>list,String fieldName){
        mReverse=false;
        return getObjectList(list,fieldName);
    }

    /**降序排列数值集合**/
    public List<T>reverseList(List<T>list){
        mReverse=true;
        return getFieldList(list);
    }

    /**降序排列对象集合**/
    public List<T>reverseList(List<T>list,String fieldName){
        mReverse=true;
        return getObjectList(list,fieldName);
    }

    /**自定义排列规则**/
    public List<T>customList(List<T>list,Comparator<T>comparator){
        if(CollectionUtil.isNotEmpty(list)){
            Collections.sort(list, comparator);
            return list;
        }
        List<T>newList=new ArrayList<>();
        return newList;
    }

    @Override
    public int compare(Object t1, Object t2) {
        if (t1 instanceof Integer) {//int
            return mReverse ? reverseCompare((int) t1, (int) t2) : sortCompare((int) t1, (int) t2);
        } else if (t1 instanceof Float) {//float
            return mReverse ? reverseCompare((float) t1, (float) t2) : sortCompare((float) t1, (float) t2);
        } else if (t1 instanceof Double) {//double
            return mReverse ? reverseCompare((double) t1, (double) t2) : sortCompare((double) t1, (double) t2);
        } else if (t1 instanceof Long) {//long
            return mReverse ? reverseCompare((long) t1, (long) t2) : sortCompare((long) t1, (long) t2);
        } else if (t1 != null && t2 != null) {//object
            Object obj1 = getFieldValueByName(mFieldName, t1);
            Object obj2 = getFieldValueByName(mFieldName, t2);
            return compare(obj1, obj2);
        } else {
            String classCastException = "强转异常:" + mFieldName + "不能转化成int,float,double,long中的任何一种类型";
            throw new ClassCastException(classCastException);
        }
    }

    /**int升序**/
    private int sortCompare(int t1,int t2){
        int i=0;
        int compare=t1-t2;
        if(compare>0){
            i=1;
        }else if(compare<0){
            i=-1;
        }
        return i;
    }

    /**float升序**/
    private int sortCompare(float t1,float t2){
        int i=0;
        float compare=t1-t2;
        if(compare>0){
            i=1;
        }else if(compare<0){
            i=-1;
        }
        return i;
    }

    /**double升序**/
    private int sortCompare(double t1,double t2){
        int i=0;
        double compare=t1-t2;
        if(compare>0){
            i=1;
        }else if(compare<0){
            i=-1;
        }
        return i;
    }

    /**long升序**/
    private int sortCompare(long t1,long t2){
        int i=0;
        long compare=t1-t2;
        if(compare>0){
            i=1;
        }else if(compare<0){
            i=-1;
        }
        return i;
    }

    /**int降序**/
    private int reverseCompare(int t1,int t2){
        int i=0;
        int compare=t1-t2;
        if(compare>0){
            i=-1;
        }else if(compare<0){
            i=1;
        }
        return i;
    }

    /**float降序**/
    private int reverseCompare(float t1,float t2){
        int i=0;
        float compare=t1-t2;
        if(compare>0){
            i=-1;
        }else if(compare<0){
            i=1;
        }
        return i;
    }

    /**double降序**/
    private int reverseCompare(double t1,double t2){
        int i=0;
        double compare=t1-t2;
        if(compare>0){
            i=-1;
        }else if(compare<0){
            i=1;
        }
        return i;
    }

    /**long降序**/
    private int reverseCompare(long t1,long t2){
        int i=0;
        long compare=t1-t2;
        if(compare>0){
            i=-1;
        }else if(compare<0){
            i=1;
        }
        return i;
    }

    /**
     * 根据属性名获取属性值 
     */
    private Object getFieldValueByName(String fieldName,Object obj) {
        Object value = null;
        if (obj != null) {
            try {
                String firstLetter = fieldName.substring(0, 1).toUpperCase();
                String getter = "get" + firstLetter + fieldName.substring(1);
                Method method = obj.getClass().getMethod(getter, new Class[]{});
                value = method.invoke(obj, new Object[]{});
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
        return value;
    }

    /**排列数值集合**/
    private List<T>getFieldList(List<T>list) {
        List<T> newlist = new ArrayList<>();
        this.mFieldName=null;
        if (CollectionUtil.isNotEmpty(list)) {
            Collections.sort(list, CompareSortor.this);
            for (T t : list) {
                newlist.add(t);
            }
        }
        return newlist;
    }

    /**排列对象集合**/
    private List<T>getObjectList(List<T>list,String fieldName){
        if(StringUtil.isNotEmpty(fieldName)){
            List<T>newlist=new ArrayList<>();
            if(CollectionUtil.isNotEmpty(list)){
                this.mFieldName=fieldName;
                Collections.sort(list,CompareSortor.this);
                for(T t:list){
                    newlist.add(t);
                }
            }
            return newlist;
        }else{
            String nullPointerException="空指针:调用getArraysList(List<T>list,String fieldName)方法时对象属性名称fieldName不能为空";
            throw new NullPointerException(nullPointerException);
        }
    }
}
3.3 CompareSortor对数字排序

代码如下:

                List<Integer>listk=new ArrayList<>();
                listk.add(1);
                listk.add(9);
                listk.add(3);
                listk.add(7);
                List<Integer>fList=CompareSortor.getInstance().sortList(listk);
                LogUtil.e(MainActivity.class,"=====fList====="+fList.toString());

打印结果:

 MainActivity:=====fList=====[1, 3, 7, 9]
3.4 CompareSortor对对像按其属性中数字大小排序

下面是对Student以age排序(注:age需要是数字,即int,float,double,long类型)

                Student stu1=new Student("c",12);
                Student stu2=new Student("a",17);
                Student stu3=new Student("d",10);
                Student stu4=new Student("b",15);

                List<Student>list=new ArrayList<>();
                list.add(stu1);
                list.add(stu2);
                list.add(stu3);
                list.add(stu4);

//                List<Student>studentList=CompareSortor.getInstance().sortList(list,"age");
                List<Student>studentList=CompareSortor.getInstance().reverseList(list,"age");
                for(Student s:studentList){
                    LogUtil.e(MainActivity.class,"=========s="+s.toString());
                }

打印结果:

MainActivity:=========s=age=17  name=a 
MainActivity:=========s=age=15  name=b 
MainActivity:=========s=age=12  name=c
MainActivity:=========s=age=10  name=d  

CompareSortor.getInstance().sortList(list,"age");方法中list表示要排序的集合,age表示list中对象是以age属性进行排列的。

当然,仅这些远远不足以满足我们的开发需求,于是有一个自定义比较方法

3.5 CompareSortor自定义排序方法
               List<Student>studentList=CompareSortor.getInstance().customList(list, new Comparator() {
                    @Override
                    public int compare(Object obj1, Object obj2) {
                        //写自己的排序规则
                        //...
                        return 0;
                    }
                });

OK,今天关于排序的就讲到这里了,谢谢诶大家

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 项目中经常会遇到列表搜索查询,大部分的查询是可以通过sql语句来实现的,有些特殊的搜索排序sql则实现不了,例如中...
    信徒_allen阅读 2,532评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,295评论 18 399
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,440评论 0 3
  • 排序规则描述类: NSSortDescriptor NSSortDescriptor来指定排序规则, 对集合等进行...
    SkyMing一C阅读 6,429评论 3 12
  • 年少轻狂酒一壶, 青春几度梦不孤。 烟云纹龙平常事, 只教旁人唾不哭。
    皓月清枫阅读 233评论 2 1