对字典数组(或自定义模型对象的数组)进行排序,将所有可选值对象保留在数组的末尾

时间:2018-11-12 07:45:43

标签: ios closures swift4

遇到排序自定义对象数组的问题,要求是:

  1. 包含模型对象的数组
  2. 需要对数组进行排序,但需要对所有对象进行排序(将所有optinals值对象保留在数组的末尾)
  3. 包含信息的对象应该优先。

我尝试过这种方式:

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
                }

但是它对数据进行排序。 提供您的输入。

1 个答案:

答案 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)]