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]
  • 相关阅读:
    牛客练习赛51 D题
    Educational Codeforces Round 72 (Rated for Div. 2) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Educational Codeforces Round 72 (Rated for Div. 2) B题
    Educational Codeforces Round 72 (Rated for Div. 2) A题
    《DSP using MATLAB》Problem 7.2
    《DSP using MATLAB》Problem 7.1
    《DSP using MATLAB》Problem 6.24
  • 原文地址:https://www.cnblogs.com/tenWood/p/9023090.html
Copyright © 2011-2022 走看看