java中多个属性的自定义排序

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

我有以下自定义代码方法来Sort,要求是我们必须基于BoardPoint、OffPoint、LastName 和 FirstName 进行自定义排序。

  1. 首先根据 BoardPoint 排序
  2. 如果 BoardPoint 相同则需要根据 OffPoint 进行排序。
  3. 如果 BoardPoint 和 OffPoint 也相同那么我们需要根据 LastName 排序
  4. 如果 BoardPoint、OffPoint 和 LastName 相同,那么我们必须根据名字排序。

我的代码:

private List<ReservationRow> sortRows(List<ReservationRow> reservationRows) {
    return reservationRows.stream()
            .sorted(Comparator.comparing(row -> row.getFlights().get(0).getBoardPoint())
               .thenComparing(row -> row.getFlights().get(0).getOffPoint())
               .thenComparing(row -> row.getNames().get(0).getLastName())
               .thenComparing(row -> row.getNames().get(0).getFirstName()))
          .toList();
}

class ReservationRow {
      private List<ReservationName> names;
      private List<ReservationFlight> flights;
      //setters and getters
}

class ReservationName {
      private String lastName;
      private String firstName;
}

class ReservationFlight {
      private String boardPoint;
      private String offPoint;
}

这里我只用

row.get(0)
进行排序。

如果我们有多个姓名和航班怎么办,因为它们是列表。所以我也必须对内部进行排序。

我做了一些研究,但无法更好地理解这一点。

java sorting comparator
1个回答
0
投票
private List<ReservationRow> sortRows(List<ReservationRow> reservationRows) {
    return reservationRows.stream()
            .sorted(Comparator.comparing(row -> row.getFlights().get(0).getBoardPoint())
                    .thenComparing(row -> row.getFlights().get(0).getOffPoint())
                    .thenComparing(row -> row.getNames().get(0).getLastName())
                    .thenComparing(row -> row.getNames().get(0).getFirstName())
                    .thenComparingInt(row -> row.getFlights().size()) // Compare based on the number of flights
                    .thenComparingInt(row -> row.getNames().size())   // Compare based on the number of names
                    .thenComparing(row -> {
                        // Compare each flight within the row
                        List<ReservationFlight> flights = row.getFlights();
                        return Comparator.comparing(ReservationFlight::getBoardPoint)
                                .thenComparing(ReservationFlight::getOffPoint)
                                .compare(flights.get(0), flights.get(flights.size() - 1));
                    })
                    .thenComparing(row -> {
                        // Compare each name within the row
                        List<ReservationName> names = row.getNames();
                        return Comparator.comparing(ReservationName::getLastName)
                                .thenComparing(ReservationName::getFirstName)
                                .compare(names.get(0), names.get(names.size() - 1));
                    }))
            .toList();
}
© www.soinside.com 2019 - 2024. All rights reserved.