通过Java排序List集合的元素的几种方法

用Java工具类Collectionssort()方法,对List集合元素进行排序。

Collections提供两种排序方法:

一、Collections.sort(List<T> list);

  此方法需要泛型T这个Bean实现Comparable<T>接口,并且实现compareTo()方法排序;

二、Collections.sort(List<T> list, Comparator<? super T> c);

  此方法,在泛型T这个Bean没有实现Comparable<T>接口的时候,多个一个参数,是一个接口我们需要实现其compare()方法排序;

排序List集合里面的元素,例如:

 1 /**
 2 * 简单的Collection排序
 3 */
 4 public static void simpleSort() {
 5     List<String> sortElement = new ArrayList<>();
 6     sortElement.add("A");
 7     sortElement.add("D");
 8     sortElement.add("R");
 9     sortElement.add("T");
10     sortElement.add("F");
11     System.out.println("未排序之前的List:" + sortElement);
12     Collections.sort(sortElement);
13     System.out.println("排序之后的List:" + sortElement);
14 }

输出结果:

未排序之前的List:[A, D, R, T, F]
排序之后的List:[A, D, F, R, T]

由于String类其实自身已经实现了Comparable接口,Java已经帮我们封装好了,所以我们不需要再实现compareTo()方法;

下面来看下,新建一个Bean,实现Comparable<T>接口,并且实现compareTo()方法来自定义排序。例如:

新建Bean:JavaProgrammer :

 1 package com.max.basis;
 2 
 3 import java.io.Serializable;
 4 
 5 /**
 6  * Java程序员
 7  * @author Max.
 8  * @date 2018/7/20
 9  */
10 public class JavaProgrammer implements Comparable<JavaProgrammer>, Serializable {
11     /**
12      * 姓名
13      */
14     private String name;
15     /**
16      * 工资
17      */
18     private int wage;
19     /**
20      * 年龄
21      */
22     private int age;
23 
24     @Override
25     public int compareTo(JavaProgrammer o) {
26         // 首先根据年龄排序
27         int sort = this.getAge() - o.getAge();
28         // 返回值0代表相等,1表示大于,-1表示小于;
29         if (sort == 0) {
30             // 在根据工资排序
31             return this.getWage() - o.getWage();
32         }
33         return sort;
34     }
35 
36     public JavaProgrammer(String name, int wage, int age) {
37         this.name = name;
38         this.wage = wage;
39         this.age = age;
40     }
41 
42     public String getName() {
43         return name;
44     }
45 
46     public void setName(String name) {
47         this.name = name;
48     }
49 
50     public int getWage() {
51         return wage;
52     }
53 
54     public void setWage(int wage) {
55         this.wage = wage;
56     }
57 
58     public int getAge() {
59         return age;
60     }
61 
62     public void setAge(int age) {
63         this.age = age;
64     }
65 }
 1 /**
 2 * Bean实现Comparable接口,实现compareTo()方法来排序
 3 */
 4 public static void sortBeans() {
 5     List<JavaProgrammer> sortBeans = new ArrayList<>();
 6     sortBeans.add(new JavaProgrammer("A", 20000, 20));
 7     sortBeans.add(new JavaProgrammer("B", 55000, 21));
 8     sortBeans.add(new JavaProgrammer("C", 65000, 20));
 9     sortBeans.add(new JavaProgrammer("D", 120000, 28));
10     sortBeans.add(new JavaProgrammer("E", 90000, 23));
11     Collections.sort(sortBeans);
12     for (JavaProgrammer javaProgrammer : sortBeans) {
13         System.out.println("姓名:" + javaProgrammer.getName()
14             + ",工资:" + javaProgrammer.getWage()
15             + ",年龄:" + javaProgrammer.getAge());
16     }
17 }

输出结果:

姓名:A,工资:20000,年龄:20
姓名:C,工资:65000,年龄:20
姓名:B,工资:55000,年龄:21
姓名:E,工资:90000,年龄:23
姓名:D,工资:120000,年龄:28

看到上面的Bean,实现了Comparable<T>接口,并且实现compareTo()方法,首先根据年龄大小排序,如果年龄相等,在根据工资大小排序;

再看不在Bean里面实现Comparable<T>接口,在需要用到排序的时候,用Collections.sort(List<T> list, Comparator<? super T> c)方法排序,例如:

新建Bean:TestBean :

 1 package com.max.basis;
 2 
 3 import java.io.Serializable;
 4 
 5 /**
 6  * 测试类
 7  * @author Max.
 8  * @date 2018/7/20
 9  */
10 public class TestBean implements Serializable {
11 
12     private Integer age;
13 
14     private Integer score;
15 
16     public TestBean(Integer age, Integer score) {
17         this.age = age;
18         this.score = score;
19     }
20 
21     public Integer getAge() {
22         return age;
23     }
24 
25     public void setAge(Integer age) {
26         this.age = age;
27     }
28 
29     public Integer getScore() {
30         return score;
31     }
32 
33     public void setScore(Integer score) {
34         this.score = score;
35     }
36 }
 1 /**
 2 * 在Collection排序的时候给人Comparator参数
 3 */
 4 private static void sortTestBean() {
 5     List<TestBean> sortList = new ArrayList<>();
 6     sortList.add(new TestBean(18, 402));
 7     sortList.add(new TestBean(18, 512));
 8     sortList.add(new TestBean(17, 633));
 9     sortList.add(new TestBean(19, 497));
10     Collections.sort(sortList, new Comparator<TestBean>() {
11         @Override
12         public int compare(TestBean o2, TestBean o1) {
13             int sort = o1.getAge() - o2.getAge();
14             if (sort == 0) {
15                 return o1.getScore() - o2.getScore();
16             }
17             return sort;
18         }
19     });
20     for (TestBean testBean : sortList) {
21         System.out.println("年龄:" + testBean.getAge() 
22             + ",总分:" + testBean.getScore());
23     }
24 }

输出结果:

年龄:19,总分:497
年龄:18,总分:512
年龄:18,总分:402
年龄:17,总分:633

 注意:如果需要排序或者降序,只需要把o1.getAge() - o2.getAge()两个互换位置就可以了。

然而上面的例子只是对List集合的英文及数字排序,再来看看Collections.sort 中文排序。

 

public static void sortString(){
    List<String> sortStringList = new ArrayList<>();
    sortStringList.add("刘邦");
    sortStringList.add("项羽");
    sortStringList.add("关羽");
    sortStringList.add("赵云");
    sortStringList.add("诸葛亮");
    sortStringList.add("曹操");
    sortStringList.add("曹操到");
    sortStringList.add("LOL");
    sortStringList.add("赵高");
    sortStringList.add("10086");
    System.out.println("未排序之前的List:" + sortStringList);
    Comparator<String> comparator = new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            Collator collator = Collator.getInstance();
            return collator.getCollationKey(o1).compareTo(collator.getCollationKey(o2));
        }
    };
    Collections.sort(sortStringList,comparator);
    System.out.println("排序之后的List:" + sortStringList);
}

 

输出结果:

未排序之前的List:[刘邦, 项羽, 关羽, 赵云, 诸葛亮, 曹操, 曹操到, LOL, 赵高, 10086]
排序之后的List:[10086, LOL, 曹操, 曹操到, 关羽, 刘邦, 项羽, 赵高, 赵云, 诸葛亮]

排序规则是:数字排在最前,英文字母其次,汉字则按照拼音进行排序。

 

posted @ 2018-07-20 17:08  Oliver.Alan-aBlog  阅读(10083)  评论(0编辑  收藏  举报