【问题标题】:Java stream to sort list by some value, and then sort duplicates by another value [duplicate]Java流按某个值对列表进行排序,然后按另一个值对重复项进行排序[重复]
【发布时间】:2020-01-28 22:59:49
【问题描述】:

假设我有一个简单的 Worker 类:

    public class Worker {

        private String name;
        private Date birthDate;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Date getBirthDate() {
            return birthDate;
        }

        public void setBirthDate(Date birthDate) {
            this.birthDate = birthDate;
        }
}

我有一个包含一些工人的列表,我需要对这个列表应用以下排序:

1) 按出生日期对工人进行排序

2) 如果有重复出生日期的工人,那么我需要按姓名对这些工人进行排序

例如:

亚当 02/11/1995

凯恩 1986 年 11 月 5 日

迈克 17/09/1999

本 17/09/1999

罗伯特 1999 年 9 月 17 日

按出生日期排序后排序:

凯恩 1986 年 11 月 5 日

亚当 02/11/1995

迈克 17/09/1999

本 17/09/1999

罗伯特 1999 年 9 月 17 日

按名称排序日期重复后的顺序:

凯恩 1986 年 11 月 5 日

亚当 02/11/1995

本 17/09/1999

迈克 17/09/1999

罗伯特 1999 年 9 月 17 日

所以,在第二步,我需要在第一步之后保存工人的顺序,并且只为具有重复出生日期的工人更改它

有什么简单的方法可以实现吗?

【问题讨论】:

    标签: java sorting java-stream


    【解决方案1】:
    List<Worker> workers;
    ...
    List<Workers> sorted =
      workers.stream()
        .sorted(
          Comparator.comparing(Worker::getBirthDate)
            .thenComparing(Worker::getName))
        .collect(Collectors.toList());
    
    

    【讨论】:

    • pholser,谢谢,事实证明,使用流真的很简单)
    【解决方案2】:

    你可以这样做:

    import java.time.LocalDate;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    class Worker {
    
        private String name;
        private LocalDate birthDate;
    
        public Worker(String name, LocalDate birthDate) {
            this.name = name;
            this.birthDate = birthDate;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public LocalDate getBirthDate() {
            return birthDate;
        }
    
        public void setBirthDate(LocalDate birthDate) {
            this.birthDate = birthDate;
        }
    
        @Override
        public String toString() {
            return "Worker [name=" + name + ", birthDate=" + birthDate + "]";
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Worker w1 = new Worker("Adam", LocalDate.of(1995, 11, 02));
            Worker w2 = new Worker("Kane", LocalDate.of(1986, 5, 11));
            Worker w3 = new Worker("Mike", LocalDate.of(1999, 9, 17));
            Worker w4 = new Worker("Ben", LocalDate.of(1999, 9, 17));
            Worker w5 = new Worker("Robert", LocalDate.of(1999, 9, 17));
    
            List<Worker> list = Arrays.asList(w1, w2, w3, w4, w5);
            Collections.sort(list, Comparator.comparing(Worker::getBirthDate).thenComparing(Worker::getName));
    
            for (Worker w : list) {
                System.out.println(w);
            }
        }
    }
    

    输出:

    Worker [name=Kane, birthDate=1986-05-11]
    Worker [name=Adam, birthDate=1995-11-02]
    Worker [name=Ben, birthDate=1999-09-17]
    Worker [name=Mike, birthDate=1999-09-17]
    Worker [name=Robert, birthDate=1999-09-17]
    

    我还建议您使用现代日期 API,例如LocalDate 而不是 Date。更多详情请查看this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 2014-05-28
      • 2017-03-21
      • 1970-01-01
      • 2016-12-11
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多