【问题标题】:Sort Arrays based on Month and Year String根据月份和年份字符串对数组进行排序
【发布时间】:2020-08-10 11:58:22
【问题描述】:

按以下格式对包含月份和年份的数组进行排序的最佳方法是:

let dateX2 = Date(); let formatter2 = DateFormatter()
formatter2.dateFormat = "MMMM,,yyyy"
let dateZ = formatter2.string(from: dateX2)

包含上述格式日期的数组的顺序不正确:

let array = ["July,,2019", "January,,2020", "February,,2019", "March,,2020"]

排序后的预期结果:

let result = ["February,,2019", "July,,2019", "January,,2020", "March,,2020"]

【问题讨论】:

  • 您有什么理由不使用原始 Date 对象并对其进行排序?
  • let sorted = array.sorted(by: { formatter.date(from: $0) ?? Date() < formatter.date(from: $1) ?? Date() }) 这可以解决问题。
  • 仅按年和月对Date 数组进行排序的最佳方法是使用compare(_:to:toGranularity:)Calendar

标签: arrays swift sorting filter array-filter


【解决方案1】:

使用 Date 对象数组作为您的数据源,然后将日期排序和格式化为您的预期输出

let formatter = DateFormatter()
formatter.dateFormat = "MMMM,,yyyy"

let sortedArry = array.sorted(by: {$0 < $1}).map {formatter.string(from: $0)}

示例输入

let oneMonth = 3600 * 24 * 30.5 //I know :) but its just to generate som test data
let array = [
    Date(timeIntervalSinceNow: -9 * oneMonth),
    Date(timeIntervalSinceNow: -3 * oneMonth),
    Date(timeIntervalSinceNow: -4 * oneMonth),
    Date(timeIntervalSinceNow: -10 * oneMonth),
]

给予

["2019 年 10 月", "2019 年 11 月", "2020 年 4 月", "2020 年 5 月"]

【讨论】:

  • 我明白你的意思,我明白了:无法将“字符串”类型的值转换为预期的参数类型“日期”
  • 不确定你指的是什么,代码中没有从字符串到日期的转换。
  • 我收到“let sortedArray =”行的错误 我的数组是 [String] 格式,这是为什么呢?
  • 请仔细阅读我的回答,它说您应该有一个 Date 对象数组,即var array: [Date]
【解决方案2】:

要对日期字符串进行排序,您需要将它们转换为 Date 对象。鉴于您的示例代码以日期对象开头,最好将它们保留为日期对象。

其他一些响应者建议在排序闭包的主体中使用对DateFormatter.date(from:) 的调用进行排序。请注意,这样做真的很慢。 (这比直接对日期对象进行排序要慢 1000 倍以上。)如果要对多个日期进行排序,最好将日期字符串与原始日期字符串和 Date 对象组合成元组,对元组进行排序,然后提取元组排序数组中的日期字符串。

this thread 中查看我的回答,我在其中展示了几种不同的对包含日期字符串的结构进行排序的方法。

【讨论】:

  • 谢谢,我已经按照你的例子对它进行了排序。
  • 如果我的回答解决了您的问题,您应该接受它,或者提供最佳解决方案的任何其他答案。这是本网站的强项。也鼓励对有用的答案进行投票,但不是必需的。
猜你喜欢
  • 2023-01-01
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2018-11-23
  • 2018-06-23
  • 2020-08-15
  • 1970-01-01
相关资源
最近更新 更多