在使用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. 使用gSoap规避和修改ONVIF标准类型结构的解析

    ONVIF/gSoap依赖关系及问题 ONVIF是一组服务规范,标准参考 gSoap是一套基于实现SOAP通信接口的工具链 即是,当我们需要访问ONVIF的Web Service或实现对ONVIF部分 ...

  2. jQuery慢慢啃之选择器(二)

    1.$("#myDiv");ID匹配一个元素 <span id="foo[bar]"></span> $("#foo\\[ba ...

  3. 『重构--改善既有代码的设计』读书笔记----Extract Class

    在面向对象中,对于类这个概念我们应该有一个清晰的责任认识,就是每个类应该只有一个变化点,每个类的变化应该只受到单一的因素,即每个类应该只有一个明确的责任.当然了,说时容易做时难,很多人可能都会和我一样 ...

  4. Java学习----方法的覆盖

    方法的覆盖:子类继承父类,子类重写父类的同名方法. 覆盖的原则: 1. 方法的参数必须跟父类保持一致 2. 子类方法的修饰符的范围必须大于等于父类方法同名的修饰符(public > privat ...

  5. js事件处理 —— 详解

    对于JS事件处理分为四部分: 1.html事件处理程序 直接添加到HTML结构中 解析:用html处理程序可以直接在button元素里直接调用,但是维护性不是很方便 <!DOCTYPE html ...

  6. Centos下安装配置LAMP(Linux+Apache+MySQL+PHP)

    Centos下安装配置LAMP(Linux+Apache+MySQL+PHP)   关于LAMP的各种知识,还请大家自行百度谷歌,在这里就不详细的介绍了,今天主要是介绍一下在Centos下安装,搭建一 ...

  7. 解决Silverlight5_tools无法安装问题(试验已成功)

    当前位置: 银光首页 > Silverlight > Silverlight学习教程 > 命令:regedit 打开节点:HKEY_LOCAL_MACHINE\SOFTWARE\Mi ...

  8. 关于Verilog 中的for语句的探讨

    在C语言中,经常用到for循环语句,但在硬件描述语言中for语句的使用较C语言等软件描述语言有较大的区别. 在Verilog中除了在Testbench(仿真测试激励)中使用for循环语句外,在Test ...

  9. Javascript 注意点

    prototype有助于减少function的冲突. 闭包有助于避免全部变量. this, prototype有助于实例化多个对象. 函数 函数表达式

  10. 再来,LVS+KEEPALIVED

    记得常规组合哟. 一般同时实现HA+LB. 如果只需要实现一个,那还不如UCARP?双机绑定一个IP作热备. CENTOS6:PACEMAKER+COROSYNC+HAPROXY. OTHER:HEA ...