按日期排序数组中的对象

Nat*_*Mio 41 arrays sorting swift

我有一个包含被调用对象的数组HistoryObject,它具有"日期","名称"等属性.

我像这样排序数组:

 let sortedArray = HistoryArray.sort({ $0.date.compare($1.date) == NSComparisonResult.OrderedDescending})
Run Code Online (Sandbox Code Playgroud)

应该将日期从较新到最旧排序.例如:

  • 2016年6月30日
  • 2016年6月29日

等等..

但是当我的数组包含"2016年7月2日"时,排序的数组变为:

  • 2016年6月30日
  • 2016年6月29日
  • 2016年7月2日

排序后"2016年7月2日"应该排在最前面,现在它位于底部?我该如何解决这个问题?

Alt*_*nov 81

使用Swift 4和Swift 3

let testArray = ["25 Jun, 2016", "30 Jun, 2016", "28 Jun, 2016", "2 Jul, 2016"]
var convertedArray: [Date] = []

var dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MM, yyyy"// yyyy-MM-dd"

for dat in testArray {
    let date = dateFormatter.date(from: dat)
    if let date = date {
        convertedArray.append(date)
    }
}

var ready = convertedArray.sorted(by: { $0.compare($1) == .orderedDescending })

print(ready)
Run Code Online (Sandbox Code Playgroud)

使用Swift 2

例如,您有包含日期​​的数组和另外1个数组,您将在其中保存转换日期:

var testArray = ["25 Jun, 2016", "30 Jun, 2016", "28 Jun, 2016", "2 Jul, 2016"]
var convertedArray: [NSDate] = []
Run Code Online (Sandbox Code Playgroud)

之后我们转换日期:

var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "dd MM, yyyy"// yyyy-MM-dd"

for dat in testArray {
    var date = dateFormatter.dateFromString(dat)
    convertedArray.append(date!)
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

var ready = convertedArray.sort({ $0.compare($1) == .OrderedDescending })

print(ready)
Run Code Online (Sandbox Code Playgroud)

  • 你不回答 OP 的问题。OP 想要对包含日期字符串的对象数组进行排序。您的代码仅对日期进行排序。 (4认同)

Ram*_*rma 14

对于Swift 3

var testArray = ["25 Jun, 2016", "30 Jun, 2016", "28 Jun, 2016", "2 Jul, 2016"]
var convertedArray: [Date] = []

var dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"

for dat in testArray {
    var date = dateFormatter.date(from: dat)
    convertedArray.append(date!)
}

//Approach : 1
convertedArray.sort(){$0 < $1}    

//Approach : 2
convertedArray.sorted(by: {$0.timeIntervalSince1970 < $1.timeIntervalSince1970})

print(convertedArray)
Run Code Online (Sandbox Code Playgroud)

  • 你不回答 OP 的问题。OP 想要对包含日期字符串的对象数组进行排序。您的代码仅对日期进行排序。 (4认同)

paw*_*222 9

雨燕5

  1. 假设我们有一个对象数组,其中日期为字符串:
struct Test {
    let dateStr: String
}
Run Code Online (Sandbox Code Playgroud)
let testObjects = ["25 Jun, 2016", "30 Jun, 2016", "28 Jun, 2016", "12 Jul, 2016"]
    .map(Test.init(dateStr:))
Run Code Online (Sandbox Code Playgroud)
  1. 创建一个DateFormatter
var dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
dateFormatter.dateFormat = "dd MMM, yyyy"
Run Code Online (Sandbox Code Playgroud)
  1. map每个项目到一个元组(测试,日期),然后按sort日期整个数组,然后map再次到测试对象:
let convertedObjects = testObjects
    .map { return ($0, dateFormatter.date(from: $0.dateStr)!) }
    .sorted { $0.1 > $1.1 }
    .map(\.0)
Run Code Online (Sandbox Code Playgroud)

以类似的方式,我们可以将日期数组排序为字符串:

  1. 假设我们有一个数组:
let testArray = ["25 Jun, 2016", "30 Jun, 2016", "28 Jun, 2016", "12 Jul, 2016"]
Run Code Online (Sandbox Code Playgroud)
  1. 创建一个DateFormatter
var dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
dateFormatter.dateFormat = "dd MMM, yyyy"
Run Code Online (Sandbox Code Playgroud)
  1. map每个项目到日期,然后是sort整个数组:
let convertedArray = testArray
    .compactMap(dateFormatter.date(from:))
    .sorted(by: >)
Run Code Online (Sandbox Code Playgroud)


小智 6

避免使用convertedArray的额外变量

使用Swift 4和Swift 3

let testArray = ["25 Jun, 2016", "30 Jun, 2016", "28 Jun, 2016", "2 Jul, 2016"]

var dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MM, yyyy"// yyyy-MM-dd"

var ready = convertedArray.sorted(by: { dateFormatter.date(from:$0).compare(dateFormatter.date(from:$1)) == .orderedDescending })

print(ready)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,将字符串转换为日期非常耗时,并且在对 `sorted()` 调用的闭包内执行此操作会使排序 ** 非常** 慢。我做了一个测试,发现对包含日期字符串的对象进行排序并在 `sorted()` 闭包中使用 `DateFormatter` 就像你建议的那样使排序比将所有日期字符串转换为日期需要 ≈ **1200 TIMES LONGER**然后对它们进行排序。因此,这是一个非常糟糕的主意。 (6认同)