Arrays 根据月份和年份字符串对数组排序

Arrays 根据月份和年份字符串对数组排序,arrays,swift,sorting,filter,array-filter,Arrays,Swift,Sorting,Filter,Array Filter,按以下格式对包含月份和年份的数组进行排序的最佳方法是什么: let dateX2 = Date(); let formatter2 = DateFormatter() formatter2.dateFormat = "MMMM,,yyyy" let dateZ = formatter2.string(from: dateX2) 包含上述格式日期的数组顺序不正确: let array = ["July,,2019", "January,,2020

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

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"]

改用日期对象数组作为数据源,然后根据预期输出对日期进行排序和格式化

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

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

[“2019年10月”、“2019年11月”、“2020年4月”、“2020年5月”]


要对日期字符串进行排序,需要将其转换为
date
对象。假设您的示例代码以日期对象开始,那么最好首先将它们作为日期对象

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


请参阅中的答案,其中我展示了对包含日期字符串的结构进行排序的两种不同方式。

为什么不使用原始日期对象并对其进行排序?
let sorted=array.sorted(by:{formatter.date(from:$0)??date()
这就可以了。只按年份和月份对
日期数组进行排序的最佳方法是使用of
日历。我明白你的意思,我得到了:无法将“String”类型的值转换为预期的参数类型“Date”。不确定你指的是什么,代码中没有从字符串到日期的转换。我从“let sortedArray=“line我的数组是[String]格式,这是为什么?请仔细阅读我的答案,它说你应该有一个日期对象数组,它是
var array:[Date]
谢谢,我已经根据您的例子对其进行了分类。如果我的答案解决了您的问题,您应该接受它,或者其他任何一个答案提供了最佳解决方案。这是本网站的一个强有力的规范。我们也鼓励您投票选出有帮助的答案,但不是必需的。
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),
]