zoukankan      html  css  js  c++  java
  • java中对List中的元素进行排序

    Collections对List集合中的数据进行排序

    有时候需要对集合中的元素按照一定的规则进行排序,这就需要用到

    Java中提供的对集合进行操作的工具类Collections,其中的sort方法


    No1.先看一个简单的例子:

     1     public static void main(String[] args) {
     2         List<Integer> nums = new ArrayList<Integer>();
     3         nums.add(2);
     4         nums.add(9);
     5         nums.add(7);
     6         nums.add(1);
     7         nums.add(0);
     8         System.out.println(nums);
     9         Collections.sort(nums);
    10         System.out.println(nums);
    11     }

     结果如下:

    [2, 9, 7, 1, 0]
    [0, 1, 2, 7, 9]


     建立一个No2代码要用的entity,如下:

     1 import java.util.Date;
     2 
     3 public class Record implements Comparable<Record> {
     4     private String name;
     5     private int age;
     6     private Date start;
     7 
     8     public Record(String name, int age, Date start) {
     9         this.name = name;
    10         this.age = age;
    11         this.start = start;
    12     }
    13 
    14     public String getName() {
    15         return name;
    16     }
    17 
    18     public void setName(String name) {
    19         this.name = name;
    20     }
    21 
    22     public int getAge() {
    23         return age;
    24     }
    25 
    26     public void setAge(int age) {
    27         this.age = age;
    28     }
    29 
    30     public Date getStart() {
    31         return start;
    32     }
    33 
    34     public void setStart(Date start) {
    35         this.start = start;
    36     }
    37 
    38     @Override
    39     public int compareTo(Record o) {
    40         int nameIndex = this.name.compareTo(o.name);
    41         int ageIndex = 0;
    42         int startIndex = 0;
    43         // 姓名一样则比较年龄
    44         if (nameIndex == 0) {
    45             ageIndex = this.age - o.age;
    46         }
    47         // 年龄一样则比较开始时间
    48         if (ageIndex == 0) {
    49             boolean isAfter = this.start.after(o.start);
    50             if (isAfter) {
    51                 startIndex = 1;
    52             } else {
    53                 startIndex = -1;
    54             }
    55         }
    56         return nameIndex+ageIndex+startIndex;
    57     }
    58 
    59 }

     No2.稍复杂一些的排序:

     1 import java.text.ParseException;
     2 import java.text.SimpleDateFormat;
     3 import java.util.ArrayList;
     4 import java.util.Collections;
     5 import java.util.List;
     6 
     7 public class ListOrder {
     8     public static void main(String[] args) throws ParseException {
     9         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    10         List<Record> records = new ArrayList<Record>();
    11         records.add(new Record("a", 2, df.parse("2015-12-16")));
    12         records.add(new Record("d", 8, df.parse("2015-12-16")));
    13         records.add(new Record("a", 1, df.parse("2019-12-16")));
    14         records.add(new Record("x", 0, df.parse("2014-12-16")));
    15         records.add(new Record("a", 1, df.parse("2018-12-16")));
    16         for (Record record : records) {
    17             System.out.println("name :" + record.getName() + " age :" + record.getAge() + " start :" + record.getStart());
    18         }
    19         Collections.sort(records);
    20         System.out.println("--------------------------------------");
    21         for (Record record : records) {
    22             System.out.println("name :" + record.getName() + " age :" + record.getAge() + " start :" + record.getStart());
    23         }
    24     }
    25 }

    输出结果:

    name :a age :2 start :Wed Dec 16 00:00:00 CST 2015
    name :d age :8 start :Wed Dec 16 00:00:00 CST 2015
    name :a age :1 start :Mon Dec 16 00:00:00 CST 2019
    name :x age :0 start :Tue Dec 16 00:00:00 CST 2014
    name :a age :1 start :Sun Dec 16 00:00:00 CST 2018
    --------------------------------------
    name :a age :1 start :Sun Dec 16 00:00:00 CST 2018
    name :a age :1 start :Mon Dec 16 00:00:00 CST 2019
    name :a age :2 start :Wed Dec 16 00:00:00 CST 2015
    name :d age :8 start :Wed Dec 16 00:00:00 CST 2015
    name :x age :0 start :Tue Dec 16 00:00:00 CST 2014


     Collections提供的第二种排序方法sort(List<T> list, Comparator<? super T> c)

    所使用的entity:

     1 import java.util.Date;
     2 
     3 public class Record {
     4     private String name;
     5     private int age;
     6     private Date start;
     7 
     8     public Record(String name, int age, Date start) {
     9         this.name = name;
    10         this.age = age;
    11         this.start = start;
    12     }
    13 
    14     public String getName() {
    15         return name;
    16     }
    17 
    18     public void setName(String name) {
    19         this.name = name;
    20     }
    21 
    22     public int getAge() {
    23         return age;
    24     }
    25 
    26     public void setAge(int age) {
    27         this.age = age;
    28     }
    29 
    30     public Date getStart() {
    31         return start;
    32     }
    33 
    34     public void setStart(Date start) {
    35         this.start = start;
    36     }
    37 }

    No3:代码:

     1 import java.text.ParseException;
     2 import java.text.SimpleDateFormat;
     3 import java.util.ArrayList;
     4 import java.util.Collections;
     5 import java.util.Comparator;
     6 import java.util.List;
     7 
     8 public class ListOrder {
     9 
    10     public static void main(String[] args) throws ParseException {
    11         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    12         List<Record> records = new ArrayList<Record>();
    13         records.add(new Record("a", 2, df.parse("2015-12-16")));
    14         records.add(new Record("d", 8, df.parse("2015-12-16")));
    15         records.add(new Record("a", 1, df.parse("2019-12-16")));
    16         records.add(new Record("x", 0, df.parse("2014-12-16")));
    17         records.add(new Record("a", 1, df.parse("2018-12-16")));
    18         for (Record record : records) {
    19             System.out
    20                     .println("name :" + record.getName() + " age :" + record.getAge() + " start :" + record.getStart());
    21         }
    22         Collections.sort(records, new Comparator<Record>() {
    23             @Override
    24             public int compare(Record r1, Record r2) {
    25                 int nameIndex = r1.getName().compareTo(r2.getName());
    26                 int ageIndex = 0;
    27                 int startIndex = 0;
    28                 // 姓名一样则比较年龄
    29                 if (nameIndex == 0) {
    30                     ageIndex = r1.getAge() - r2.getAge();
    31                 }
    32                 // 年龄一样则比较开始时间
    33                 if (ageIndex == 0) {
    34                     boolean isAfter = r1.getStart().after(r2.getStart());
    35                     if (isAfter) {
    36                         startIndex = 1;
    37                     } else {
    38                         startIndex = -1;
    39                     }
    40                 }
    41                 return nameIndex + ageIndex + startIndex;
    42             }
    43         });
    44         System.out.println("--------------------------------------");
    45         for (Record record : records) {
    46             System.out
    47                     .println("name :" + record.getName() + " age :" + record.getAge() + " start :" + record.getStart());
    48         }
    49     }
    50 }

    結果:

    name :a age :2 start :Wed Dec 16 00:00:00 CST 2015
    name :d age :8 start :Wed Dec 16 00:00:00 CST 2015
    name :a age :1 start :Mon Dec 16 00:00:00 CST 2019
    name :x age :0 start :Tue Dec 16 00:00:00 CST 2014
    name :a age :1 start :Sun Dec 16 00:00:00 CST 2018
    --------------------------------------
    name :a age :1 start :Sun Dec 16 00:00:00 CST 2018
    name :a age :1 start :Mon Dec 16 00:00:00 CST 2019
    name :a age :2 start :Wed Dec 16 00:00:00 CST 2015
    name :d age :8 start :Wed Dec 16 00:00:00 CST 2015
    name :x age :0 start :Tue Dec 16 00:00:00 CST 2014


    reference:

    https://blog.csdn.net/veryisjava/article/details/51675036

    https://www.jb51.net/article/72284.htm

    https://blog.csdn.net/u012901117/article/details/76853113

    >
    作者:豌豆果果
    出处:https://www.cnblogs.com/hylogs/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    觉得有所帮助,可以请果果喝咖啡哟^_^!

  • 相关阅读:
    统计nginx日志里访问次数最多的前十个IP
    while 格式化输出 运算符 字符编码
    Python 软件安装
    Python 基础
    Typora 基础的使用方法
    Django ORM (四) annotate,F,Q 查询
    Django 惰性机制
    Django ORM (三) 查询,删除,更新操作
    Django ORM (二) 增加操作
    Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍
  • 原文地址:https://www.cnblogs.com/hylogs/p/9348789.html
Copyright © 2011-2022 走看看