在使用List集合时,通常情况下希望从集合中得到的对象是按照一定顺序排列的,但是List集合的默认排序方式为按照对象的插入顺序,可以通过java.util.Collections类的静态方法sort(List<T> list)、sort(List<T> list,Comparator<? super T> c)或reverse(List<?> list)对集合中的对象进行客户化排序,其中方法sort(List<T> list)和reverse(List<?> list)要求集合中的对象必须实现java.lang.Comparable接口,即实现方法compareTo(),该方法的具体定义如下: 
public int compareTo(T o); 
方法sort(List<T> list)是将集合中的所有对象按正序排列,方法reverse(List<?> list)是将集合中的所有对象按倒序排列;方法sort(List<T> list,Comparator<? super T> c)不要求集合中的对象必须实现Comparable接口,但是在使用该方法时需要显式设置比较器,即该方法的第2个入口参数,比较器必须实现java.util.Comparator接口,即实现方法compare(),该方法的就具体定义如下: 
int compare(T o1,T o2); 
比较器的功能是实现对集合中所有对象的排序策略。 
注意:List集合进行客户化排序的前提条件是List集合中的元素为同一类型。 
1、通过实现java.lang.Comparable接口实现客户化排序

实体类:

public class Person implements Comparable{   //实现接口Comparable
    private String name;  
    private long id_card;  
    public String getName(){  
        return name;  
    }  
    public void setName(String name){  
        this.name = name;  
    }  
    public long getId_card(){  
        return id_card;  
    }  
    public void setId_card(long id_card){  
        this.id_card = id_card;  
    }  
    public int compareTo(Object o){//实现Comparable接口的方法  
        Person p = (Person)o;  
        String s1 = CnToSpell.getFullSpell(this.name);//获得汉字的全拼  
        String s2 = CnToSpell.getFullSpell(p.getName());  
        return s1.compareTo(s2);//比较两个字符串的大小  
    }  
}

测试类:
import java.util.*;  
public class TestList{  
    public static void main(String args[]){  
        List<Person> list = new ArrayList<Person>();  
        String names[] = {"马先生","王小姐","李先生"};  
        long id_cards[] ={22015,22020,22018};  
        for(int i=0;i<names.length;i++){//初始化List集合  
            Person person = new Person();  
            person.setName(names[i]);  
            person.setId_card(id_cards[i]);  
            list.add(person);  
        }  
        System.out.println("排序前:");  
        for(int i=0;i<list.size();i++){//遍历List集合  
            Person person = list.get(i);  
            System.out.println("-----"+person.getName()+"   "+person.getId_card());  
        }  
        //利用java.util.Collections类的sort(List list)或reverse(List list)方法对List集合排序  
        Collections.sort(list);//按升序排序  
        System.out.println("升序排列后:");  
        for(int i=0;i<list.size();i++){//遍历List集合  
            Person person = list.get(i);  
            System.out.println("-----"+person.getName()+"   "+person.getId_card());  
        }  
        Collections.reverse(list);//按降序排列  
        System.out.println("降序排列后:");  
        for(int i=0;i<list.size();i++){//遍历List集合  
            Person person = list.get(i);  
            System.out.println("-----"+person.getName()+"   "+person.getId_card());  
        }  
    }  
}

程序的运行结果如下: 
排序前: 
-----马先生     22015 
-----王小姐     22020 
-----李先生     22018 
升序排列后: 
-----李先生     22018 
-----马先生     22015 
-----王小姐     22020 
降序排列后: 
-----王小姐     22020 
-----马先生     22015 
-----李先生     22018 
利用这种方式实现对List集合进行客户化排序,缺点是对于每个类只能采用一种排序方式,对于排序方式需求单一的对象,可采用该种方式。 
2、通过实现java.util.Comparator接口实现客户化排序

public class Person{  
    private String name;  
    private long id_card;  
    public long getId_card(){  
        return id_card;  
    }  
    public void setId_card(long id_card){  
        this.id_card = id_card;  
    }  
    public String getName(){  
        return name;  
    }  
    public void setName(String name){  
        this.name = name;  
    }  
}

import java.util.Comparator;  
public class PersonComparator implements Comparator{  
    //为可能参与排序的属性定义同名的静态常量值  
    public static final int NAME = 1;  
    public static final int ID_CARD = 2;  
    private int orderByColumn = 1;//默认排序为按姓名排序  
    public int compare(Object o1,Object o2){//实现Comparator接口的方法  
        Person p1 = (Person)o1;  
        Person p2 = (Person)o2;  
        int result = 0;//默认的判断结果为两个对象相等  
        switch(orderByColumn){//判断排序条件  
            case 1://按姓名排序  
                String s1 = CnToSpell.getFullSpell(p1.getName());//获得汉字的全拼  
                String s2 = CnToSpell.getFullSpell(p2.getName());  
                result = s1.compareTo(s2);//比较两个字符串的大小  
                break;  
            case 2:  
                result = (int)(p1.getId_card()-p2.getId_card());//比较两个整数的大小  
                break;  
        }  
        return result;  
    }  
    public void orderByColumn(int orderByColumn){//用来设置排序条件  
        this.orderByColumn = orderByColumn;  
    }  
}

public class TestList{  
    public static void main(String args[]){  
        List<Person> list = new ArrayList<Person>();  
        String names[] ={"马先生","王小姐","李先生"};  
        long id_cards[] = {22015,22020,22018};  
        for(int i= 0;i<names.length;i++){  
            Person person = new Person();  
            person.setName(names[i]);  
            person.setId_card(id_cards[i]);  
            list.add(person);  
        }  
        System.out.println("排序前:");  
        for(int i=0;i<list.size();i++){  
            Person person = list.get(i);  
            System.out.println("-----"+person.getName()+"   "+person.getId_card());  
        }  
        PersonComparator personComparator = new PersonComparator();//创建比较器对象  
        System.out.println("按姓名排序:");  
        Collections.sort(list,personComparator);//默认为按姓名排序,排序List集合  
        for(int i=0;i<list.size();i++){  
            Person person = list.get(i);  
            System.out.println("-----"+person.getName()+"   "+person.getId_card());  
        }  
        System.out.println("按编号排序:");  
        personComparator.orderByColumn(PersonComparator.ID_CARD);//设置为按编号排序  
        Collections.sort(list,personComparator);  
        for(int i=0;i<list.size();i++){  
            Person person = list.get(i);  
            System.out.println("-----"+person.getId_card()+"    "+ person.getName());  
        }  
    }  
}  
程序的运行结果如下: 
排序前: 
-----马先生     22015 
-----王小姐     22020 
-----李先生     22018 
按姓名排序: 
-----李先生     22018 
-----马先生     22015 
-----王小姐     22020 
按编号排序: 
-----22015      马先生 
-----22018      李先生 
-----22020      王小姐

利用这种方式实现对List集合进行客户化排序,排除了每个类只能采用一种排序方式的弊端,可以根据实际需要,将List集合按照不同的方式排序。这里是按姓名的全称升序排列,如果想改为降序排列,只需将例子中的的如下代码:

result = s1.compareTo(s2);

修改改为:

result = s2.compareTo(s2);

编号也是按升序排列的,如果也想改为降序排列,只需将例子中的如下代码:

result = (int)(p1.getId_card()-p2.getId_card());

修改为:

result = (int)(p2.getId_card()-p1.getId_card());

 
 
 
 
 

Collections之sort、reverse的更多相关文章

  1. Python3基础 sort(reverse=True) 将一个列表降序排列

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  2. Collections在sort()简单分析法源

    Collections的sort方法代码: public static <T> void sort(List<T> list, Comparator<? super T& ...

  3. java中的排序(自定义数据排序)--使用Collections的sort方法

    排序:将一组数据按相应的规则 排列 顺序 1.规则:       基本数据类型:日常的大小排序. 引用类型: 内置引用类型(String,Integer..),内部已经指定规则,直接使用即可.---- ...

  4. python 8:list.sort(reverse=false)、sorted(list, reverse=false)(对列表进行不可恢复排序;对列表进行可恢复排序)

    bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(bicycles) print(sorted(bicycles)) ...

  5. Vue 变异方法sort&reverse对评论进行排序

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 对象数组自定义排序--System.Collections.ArrayList.Sort()

    使用System.Collections.ArrayList.Sort()对象数组自定义排序 其核心为比较器的实现,比较器为一个类,继承了IComparer接口并实现int IComparer.Com ...

  7. 数组方法push() pop() shift() unshift() splice() sort() reverse() contact()浅拷贝 slice()原数组拷贝

    push() pop() shift() unshift() splice() sort() reverse() 参考资料:https://wangdoc.com/javascript/stdlib/ ...

  8. Java基础 @org.junit.Test-单元测试方法 + 操纵Collection和Map的工具类 : Collections 的sort/binarySearch/max/min等静态方法

      单元测试代码:  ( 在IDEA中先输入'@Test '然后根据提示进行自动修订即可!!运行时直接运行即可! 若有多个单元测试块的时候,直接把鼠标放在哪里就自动在哪里运行那个单元块) import ...

  9. js sort() reverse()

    数组中存在的两个方法:sort()和reverse() 直接用sort(),如下: ,,,,,,,,,,,]; console.log(array.sort());ps:[0, 1, 2, 2, 29 ...

随机推荐

  1. Javascript基础(2)

    开始更咯~~~嘻嘻. ---------------------------------------------------------------------------------- 异常捕获:即 ...

  2. 使用SQL Server 2008远程链接时SQL数据库不成功的解决方法

    关键设置: 第一步(SQL2005.SQL2008): 开始-->程序-->Microsoft SQL Server 2008(或2005)-->配置工具-->SQL Serv ...

  3. javascript原型模式理解

    传统的面向对象语言中,创建一个对象是通过使用类来创建一个对象的,比如通过类飞行器来创建一个对象,飞机. 而js这种没有类概念的动态设计语言中,创建对象是通过函数来创建的,所以通常也把js称为函数式语言 ...

  4. js创建对象的三种方法:文本标识法和构造器函数法和返回对象的函数

    文本标识法和定义变量差不多,像这样 var obj = {name:'HanMM','2':'Dali'}; 函数构造器法  先创建一个对象函数 function Obj() { this.addre ...

  5. Jquery 获取日期date()对象

    获取JavaScript 的时间使用内置的Date函数完成 var mydate = new Date(); mydate.getYear(); //获取当前年份(2位) mydate.getFull ...

  6. 80端口被占用 PID = 4解决办法

    请按照下面的步骤来运行命令:1. sc config http stat = demand2. reboot3. run the command(netsh http show servicestat ...

  7. 面试后 follow up letter 分享

    分享一下最近面试外企的follow up letter. Dear Mr. Xu,     Thank you again for the time you and Mr. Guo spent wit ...

  8. .net程序员必须知道的知识

    A while back, I posted a list of ASP.NET Interview Questions. Conventional wisdom was split, with ab ...

  9. 入门5:PHP 语法基础——流程控制

    一.if...else 语句 if( ) else{ } 如果 .... 就.... 否则.... if(判断){ 判断成立 则执行该表达式 }else{ 如果上方判断都不成立 则执行该表达式 } i ...

  10. Objective-C基础 便利构造器 单例模式1-17

    Objective-C基础 便利构造器 单例模式1-17 便利构造器 单例模式 1.在声明时指定setter或getter方法,则用点运算符方法调用时默认调用的就是自己指定的方法2.单例:唯一性,如: ...