排序日期数组,但如果过去的日期下降到Array Swift的底部

时间:2018-01-30 21:06:55

标签: sorting date swift3 nsarray

我需要按时间顺序为即将发生的事件排序。 我需要最近的日期字符串在顶部,由下面的事件降序。但我想将过去的事件放到数组/表格的底部,我将隐藏日期和时间,以便显示历史记录。

如果有所不同,它是一个结构数组

例如:

Event3 - 14:15

Event4 - 15:00

Event5 - 18:03

Event1 -

Event2 -

以下用于命令我的数组,我只想将过去的日期删除到底部

newArray = oldArray.sorted(by: {Date(timeIntervalSinceNow: $0.eventTime < Date(timeIntervalSinceNow: $1.eventTime})

2 个答案:

答案 0 :(得分:1)

解决方案A:排序,拆分和组合

let now = Date()
let sortedArray = myArray.sorted(by: { $0.startTime < $1.startTime })
var finalArray = sortedArray
if let index = sortedArray.index(where: { $0.startTime > now }) {
    if index > 0 {
        finalArray = Array(sortedArray[index ..< sortedArray.endIndex] + sortedArray[sortedArray.startIndex ... index - 1])
    }
}

解决方案B(更快):按谓词排序

let now = Date()
let newArray = myArray.sorted(by: {
    if $0.startTime > now {
        if $1.startTime > now {
            return $0.startTime < $1.startTime
        } else {
            return true
        }
    } else {
        if $1.startTime > now {
            return false
        } else {
            return $0.startTime < $1.startTime
        }
    }
})

答案 1 :(得分:0)

作为一个临时解决方案,我已经做到了这一点,我确信有更优雅的方式,但它可能会帮助其他人,直到更好的解决方案出现

        let allStartToFin = myArrat.sorted(by: {Date(timeIntervalSinceNow:($0.startTime)!).timeIntervalSinceNow < Date(timeIntervalSinceNow:($1.startTime)!).timeIntervalSinceNow})

        var correctOrder = [Object]()
        var past = [Object]()
        for item in 0...(allStartToFin.count - 1) {
            if (Date(timeIntervalSince1970: TimeInterval((allStartToFin[item].startTime)!))) > Date() {
                correctOrder.append(allStartToFin[item])
            } else {
               past.append(allStartToFin[item])
            }
            if item == (allStartToFin.count - 1) {
                correctOrder = correctOrder + past
                self.finalArray = correctOrder
                self.tableView.reloadData()
            }
        }