遇到排序自定义对象数组的问题,要求是:
我尝试过这种方式:
let mSortedFlights = gatesFlightCardArray.sorted(by: { ($0.departureFlight?.flight_number != nil || $0.arrivalFlight?.flight_number != nil) && $0.departureFlight?.time!.localizedStandardCompare(($1.departureFlight?.time!)!) == .orderedAscending })
if mSortedFlights.count > 0 {
gatesFlightCardArray = mSortedFlights
}
但是它对数据进行排序。 提供您的输入。
答案 0 :(得分:0)
sort方法不应整理出nil值。例如,排序此Int数组?保留nil值并将其排序到末尾:
var a = [0, 10, 3, nil, 5, 7, 2, nil, 4]
a.sort { v0, v1 -> Bool in
guard let v0 = v0 else {
return false
}
guard let v1 = v1 else {
return true
}
return v0 < v1
}
print(a)
结果如下:
[0, 2, 3, 4, 5, 7, 10, nil, nil]
对于您的示例,我不确定要根据什么条件进行排序。所以我建立了一个示例,您可以使用。我先按DelightFlight的航班号对数组进行排序,然后再按到达航班的航班号进行排序。
let sortedTrips = trips.sorted { trip0, trip1 -> Bool in
// Sort all trips where either arrival or departure flight are nil to the end
guard let departureFlight0 = trip0.departureFlight, let arrivalFlight0 = trip0.arrivalFlight else {
return false
}
guard let departureFlight1 = trip1.departureFlight, let arrivalFlight1 = trip1.arrivalFlight else {
return true
}
// Sort by primary criterion of departure flight number
if departureFlight0.flightNumber < departureFlight1.flightNumber {
return true
} else if departureFlight0.flightNumber == departureFlight1.flightNumber {
// If the departureFlightNumbers of both trips are equal, sort by arrival flight number
return arrivalFlight0.flightNumber < arrivalFlight1.flightNumber
} else {
return false
}
}
print(sortedTrips, separator: "\n")
要自己尝试一下,除了排序代码外,还请将我的课程和示例数据复制到游乐场:
class Flight: CustomStringConvertible {
private(set) var flightNumber: Int
private(set) var time: String
init(flightNumber: Int, time: String) {
self.flightNumber = flightNumber
self.time = time
}
var description: String {
return "\(flightNumber) at \(time)"
}
}
class Trip: CustomStringConvertible {
private(set) var departureFlight: Flight?
private(set) var arrivalFlight: Flight?
init(departureFlight: Flight?, arrivalFlight: Flight?) {
self.departureFlight = departureFlight
self.arrivalFlight = arrivalFlight
}
var description: String {
return "\(departureFlight?.description ?? "na") - \(arrivalFlight?.description ?? "na")"
}
}
var trips = [Trip(departureFlight: Flight(flightNumber: 3, time: "10:45"), arrivalFlight: Flight(flightNumber: 9, time: "12:45")),
Trip(departureFlight: nil, arrivalFlight: Flight(flightNumber: 9, time: "12:45")),
Trip(departureFlight: Flight(flightNumber: 3, time: "12:45"), arrivalFlight: Flight(flightNumber: 5, time: "12:45")),
Trip(departureFlight: Flight(flightNumber: 8, time: "13:48"), arrivalFlight: nil),
Trip(departureFlight: nil, arrivalFlight: nil),
Trip(departureFlight: Flight(flightNumber: 4, time: "11:31"), arrivalFlight: Flight(flightNumber: 9, time: "12:45")),
Trip(departureFlight: nil, arrivalFlight: nil)]