【问题标题】:How to sort date array?如何对日期数组进行排序?
【发布时间】:2018-02-07 08:29:06
【问题描述】:

我想用年份对满月的数组进行排序,例如:

["Nov 2019","Apr 2020","MAR 2018","Jan 2018","May 2018"]

(未排序)

到:

["Jan 2018","Mar 2018","May 2018","Nov 2019","Apr 2020"]

(排序)像这样......

func sortDate( arr : inout [String]) {
    let months : [String] = ["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"]
    for i in 0..<arr.count{
        for j in i..<arr.count{
            let string1 = arr[i]
            let string2 = arr[j]
            let month1 = String(string1[string1.startIndex...string1.index(string1.startIndex, offsetBy: 2)])
            let month2 = String(string2[string2.startIndex...string2.index(string2.startIndex, offsetBy: 2)])
            if months.index(of: month1.lowercased())! > months.index(of: month2.lowercased())! {
                let temp = arr[i]
                arr[i] = arr[j]
                arr[j] = temp
            }
        }
    }
    for i in 0..<arr.count{
        for j in i..<arr.count{
            let string1 = arr[i]
            let string2 = arr[j]
            if (string1[string1.index(before: string1.endIndex)..<string1.endIndex] as NSString).intValue < (string2[string2.index(before: string2.endIndex)..<string2.endIndex] as NSString).intValue {
                let temp = arr[i]
                arr[i] = arr[j]
                arr[j] = temp
            }

        }
    }

}

这是我尝试过的,但它不能正常工作。

这是输入:

["Jan 2020", "Feb 2018", "Mar 2018", "Apr 2018", "May 2018", "Jun 2018", "Jul 2018", "Aug 2018", "Sep 2018", "Oct 2018", "Nov 2018", "Jun 2019", "Feb 2019", "Jul 2019", "Apr 2019", "Aug 2019", "Sep 2019", "May 2019", "Oct 2019", "Jan 2019", "Mar 2019", "Nov 2019"]

输出是:

["Jan 2019", "Feb 2019", "Mar 2019", "Apr 2019", "May 2019", "Jun 2019", "Jul 2019", "Aug 2019", "Sep 2019", "Oct 2019", "Nov 2019", "Jul 2018", "Mar 2018", "May 2018", "Aug 2018", "Feb 2018", "Sep 2018", "Oct 2018", "Apr 2018", "Nov 2018", "Jun 2018", "Jan 2020"]

【问题讨论】:

  • 您可以将日期字符串转换为日期,然后您可以轻松地对日期数组进行排序。
  • @chauhan 我会试试的

标签: arrays swift sorting


【解决方案1】:

我可能会使用日期格式化程序来解析这些日期,然后按其排序:

let input = ["Jan 2020", "Feb 2018", "Mar 2018", "Apr 2018", "May 2018", "Jun 2018", "Jul 2018", "Aug 2018", "Sep 2018", "Oct 2018", "Nov 2018", "Jun 2019", "Feb 2019", "Jul 2019", "Apr 2019", "Aug 2019", "Sep 2019", "May 2019", "Oct 2019", "Jan 2019", "Mar 2019", "Nov 2019"]
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "MMM yyyy"
let output = input.sorted { string1, string2 in
    guard let date1 = formatter.date(from: string1) else { return true }
    guard let date2 = formatter.date(from: string2) else { return false }
    return date1 < date2
}

或者,如果您有很多字符串并且想要消除多余的格式化程序转换:

let output = input
    .map { (string: $0, date: formatter.date(from: $0)) }
    .sorted {
        guard let date1 = $0.date else { return true }
        guard let date2 = $1.date else { return false }
        return date1 < date2
    }.map { $0.string }

【讨论】:

  • 吹毛求疵:比较器不是“严格的弱排序”,如果 string1==string2 无效(违反非自反性),它会返回 true :) 更改 2 个保护语句的顺序应该可以解决这个问题。
  • 感谢您与我们分享这个答案。对我有很大帮助
【解决方案2】:

试试这个:

let dateStringArray = ["Jan 2020", "Feb 2018", "Mar 2018", "Apr 2018", "May 2018", "Jun 2018", "Jul 2018", "Aug 2018", "Sep 2018", "Oct 2018", "Nov 2018", "Jun 2019", "Feb 2019", "Jul 2019", "Apr 2019", "Aug 2019", "Sep 2019", "May 2019", "Oct 2019", "Jan 2019", "Mar 2019", "Nov 2019"]
var dateArray = [Date]()
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM yyyy"

for dateString in dateStringArray{
    let date = dateFormatter.date(from: dateString)
    if let convertedDate = date{
        dateArray.append(convertedDate)
    }
}

for date in dateArray.sorted(by: {$0 < $1}){
    let dateString = dateFormatter.string(from: date)
    print(dateString)
}

您将获得可以存储的日期字符串,这将是排序的字符串数组。

【讨论】:

    【解决方案3】:

    你好@Boobesh 请使用此代码。

    let sortedArray = datesArray.sorted { ($0 as! String).localizedCaseInsensitiveCompare($1 as! String) == .orderedDescending}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多