zoukankan      html  css  js  c++  java
  • (转载)java list排序

    1、简介                                

    这个和数组的排序又不一样了。

    其实Java针对数组和List的排序都有实现,对数组而言,你可以直接使用Arrays.sort对于List和Vector而言,你可以使用Collections.sort方法

    Java API针对集合类型的排序提供了2个方法:

    java.util.Collections.sort(java.util.List)
    
    java.util.Collections.sort(java.util.List, java.util.Comparator)

    如果集合里面的元素都是相同类型的,并且实现了Comparable接口,那么可以直接调用第一个方法。

    如果你有其它的排序的想法,比如你不想按照自然排序进行,还可以传一个Comparator过去,比如反向。

    元素不相同的情况比较复杂,可以暂时不用考虑。

    2、通过实现Comparable接口来实现list的排序    

    假如现在我们有一个Person类的list集合,要让其按照一个Order属性进行排序,我们可以让Person类实现Comparable接口,重写其CompareTo方法即可。具体实现如下:

    1)、Person实体类

    public class Person implements Comparable<Person> {
        private String name;
        private Integer order;
     
        /**
         * @return the name
         */
        public String getName() {
            return name;
        }
     
        /**
         * @param name
         *            the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
     
        /**
         * @return the order
         */
        public Integer getOrder() {
            return order;
        }
     
        /**
         * @param order
         *            the order to set
         */
        public void setOrder(Integer order) {
            this.order = order;
        }
     
    
        @Override
        public int compareTo(Person arg0) {
            return this.getOrder().compareTo(arg0.getOrder());      //这里定义你排序的规则。
        }
     
    }

    通过重写Comparable接口的compareTo方法,可以让程序按照我们想要的排列方式进行排序,如:这里我让Person按照order属性升序排序。

    2)、测试类

    public static void main(String[] args) {
        //初始化数据
        List<Person> listA = new ArrayList<Person>();
        Person p1 = new Person();
        Person p2 = new Person();
        Person p3 = new Person();
     
        p1.setName("name1");
        p1.setOrder(1);
        p2.setName("name2");
        p2.setOrder(2);
        p3.setName("name3");
        p3.setOrder(3);
     
        listA.add(p2);
        listA.add(p1);
        listA.add(p3);
    
        //排序
        Collections.sort(listA);
    
        //打印排序后的Person
        for (Person p : listA) {
            System.out.println(p.getName());
        }
    }

    3)、结果:

    name1
    name2
    name3

    3、通过重载Collections.sort方法                    

    直接重载java.util.Collections.sort(java.util.List, java.util.Comparator) 方法。可以灵活的修改我们排序的方式,具体实现如下:

    1)、Person实体类

      和上面的类相同,但没实现Comparable接口

    public class Person {
        private String name;
        private Integer order;
     
        /**
         * @return the name
         */
        public String getName() {
            return name;
        }
     
        /**
         * @param name
         *            the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
     
        /**
         * @return the order
         */
        public Integer getOrder() {
            return order;
        }
     
        /**
         * @param order
         *            the order to set
         */
        public void setOrder(Integer order) {
            this.order = order;
        }
     
    }

    2)、测试类

    public static void main(String[] args) {
            List<Person> listA = new ArrayList<Person>();
            Person p1 = new Person();
            Person p2 = new Person();
            Person p3 = new Person();
     
            p1.setName("name1");
            p1.setOrder(1);
            p2.setName("name2");
            p2.setOrder(2);
            p3.setName("name3");
            p3.setOrder(3);
     
            listA.add(p2);
            listA.add(p1);
            listA.add(p3);
             
            //直接在这里添加我们的排序规则
            Collections.sort(listA, new Comparator<Person>() {
                public int compare(Person arg0, Person arg1) {
                    return arg0.getOrder().compareTo(arg1.getOrder());
                }
            });
             
            for (Person p : listA) {
                System.out.println(p.getName());
            }
        }

    从上面看到,直接在Conllections.sort()方法中重写了一个Comparator接口,可以在不同的地方使用Person集合的不同排序方法。如上面还是按照Person的order属性升序排列,我只要改写该方法,就可以在其他地方按照其他的规则对我的list集合进行排序,但是这样子代码看起来会比前面的那种方式繁琐。

    3)、结果

    name1
    name2
    name3

      致谢:感谢您的阅读!

    4.扩展:按照两个字段排序      

    比如先按照名字排序,如果名字相同,按照小名排序;例子如下:

    package com.cy.model;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class Student implements Comparable<Student>{
        private int id;
        private String name;    //名字
        private String sname;    //小名
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getSname() {
            return sname;
        }
        public void setSname(String sname) {
            this.sname = sname;
        }
        public Student(int id, String name, String sname) {
            super();
            this.id = id;
            this.name = name;
            this.sname = sname;
        }
        @Override
        public String toString() {
            return "Student [id=" + id + ", name=" + name + ", sname=" + sname
                    + "]";
        }
        /**
         * student类的排序方法
         * 先按照name排序,如果name相同按照sname排序
         */
        @Override
        public int compareTo(Student o) {
            int r1 = this.getName().compareToIgnoreCase(o.getName());
            int r2 = this.getSname().compareToIgnoreCase(o.getSname());
            
            return  r1>0?1:
                    r1<0?-1:
                    r2>0?1:
                    r2<0?-1:0;
        }
        
        //测试程序
        public static void main(String[] args) {
            Student s1 = new Student(2,"zhangsan","z");
            Student s2 = new Student(1, "zhangsan","b");
            Student s3 = new Student(3, "zhangsan","y");
            Student s4 = new Student(0, "lisi","s");
            Student s5 = new Student(5, "wangwu","w");
            Student s6 = new Student(10, "wangwu","xx");
            Student s7 = new Student(8, "aming","ming");
            
            List<Student> list = new ArrayList<Student>();
            list.add(s1);list.add(s2);list.add(s3);list.add(s4);
            list.add(s5);list.add(s6);list.add(s7);
            
            Collections.sort(list);
            
            for(Student s : list){
                System.out.println(s);
            }
        }
        
    }

    打印:

    Student [id=8, name=aming, sname=ming]
    Student [id=0, name=lisi, sname=s]
    Student [id=5, name=wangwu, sname=w]
    Student [id=10, name=wangwu, sname=xx]
    Student [id=1, name=zhangsan, sname=b]
    Student [id=3, name=zhangsan, sname=y]
    Student [id=2, name=zhangsan, sname=z]
  • 相关阅读:
    UVa-133-救济金发放
    UVa-340-猜数字
    UVa-1584-环状序列
    UVa-1585-得分
    UVa-1586-分子量
    BZOJ-3289: Mato的文件管理(莫队算法+树状数组)
    HDU-2824 The Euler function(欧拉函数)
    2017年10月12日22:27:20
    HDU-4715 Difference Between Primes(线性筛法)
    POJ-1185 炮兵阵地(状态压缩DP)
  • 原文地址:https://www.cnblogs.com/tenWood/p/9023090.html
Copyright © 2011-2022 走看看