zoukankan      html  css  js  c++  java
  • 通过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, 曹操, 曹操到, 关羽, 刘邦, 项羽, 赵高, 赵云, 诸葛亮]

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

  • 相关阅读:
    C# 通过Attribute制作的一个消息拦截器
    Newtonsoft.Json高级用法
    这些年,我收集的JavaScript代码(一)
    Storm整体架构分析
    Worker的内部工作原理
    Storm源码分析
    Storm集群部署
    Storm 官方文档翻译 --- 消息的可靠性保障
    [转] 如何快速掌握一门新技术/语言/框架
    小狗钱钱读书笔记
  • 原文地址:https://www.cnblogs.com/oablog/p/9342233.html
Copyright © 2011-2022 走看看