使用两个条件对列表进行排序

问题描述 投票:0回答:1

我在排序方面遇到了一些问题。我有一个 Person 类,其中包含两个参数:年龄和出生时间:

public class Person {
int age; 
private final Instant birthTime;

我想编写排序逻辑,按年数对人员列表进行排序,如果年数相同,则按出生日期排序。我写了这样的逻辑:

return people.stream().sorted((p1, p2) -> {
        if (p1.getAge() != p2.getAge()) {
            return Integer.compare(p2.getAge(), p1.getAge());
        } else {
            return p2.birthTime().compareTo(p1.birthTime());
        }
    }).collect(Collectors.toList());

但我认为这不是一个正确的实现,我想知道如果两个人同时出生会发生什么。谁能提出更好的解决方案吗?

java sorting collections
1个回答
0
投票

假设您正在为 Person 类使用

record
List<Person>
,您可以这样做。 流式传输不是必需的,因为 List 接口具有排序方法。但你的做法并没有什么问题。您使用的排序方法是稳定排序,因此如果所有测试都相等,则 stet 下的两个人将保持相同的相对顺序。

record Person(int age, Instant birthTime) {
}

List<Person> people = new ArrayList<>();

Comparator<Person> comp = Comparator.comparing(Person::age)
                .thenComparing(Person::birthTime);
people.sort(comp);

© www.soinside.com 2019 - 2024. All rights reserved.