2 Replies
      Latest reply on Feb 8, 2019 8:01 PM by OOPer
      BurierA Level 1 Level 1 (0 points)

        I have array of string. items are dates , such this

         let array = ["2019-1-10","2015-4-2","2010-11-21"]

        how to sort this Descending?

        • Re: How to sort array of dates as string?
          Claude31 Level 8 Level 8 (5,485 points)

          You can use a regex to parse the strings and sort.

           

          Something like (can certainly be simplified):

          func parser(aDate: String) -> (y: Int, m: Int, d: Int) {
              var year = 0
              var month = 0
              var day = 0
             
              let patternY = "[0-9]{4}" // 1 or 2 digits, followed by -
              let regexY = try! NSRegularExpression(pattern: patternY)
              if let matchY = regexY.firstMatch(in: aDate, range: NSRange(0..<adate.utf16.count)) {<br="">        let yStr = String(aDate[Range(matchY.range(at: 0), in: aDate)!])
                  year = Int(yStr) ?? 0
                  let patternM = "[-][0-9]{1,2}"  //  1 or 2 digits
                  let regexM = try! NSRegularExpression(pattern: patternM)
                  if let matchM = regexM.firstMatch(in: aDate, range: NSRange(0..<adate.utf16.count)) {<br="">            let mStr = String(aDate[Range(matchM.range(at: 0), in: aDate)!]).dropFirst()
                      month = Int(mStr) ?? 0
                      let patternD = "[-][0-9]{1,2}"  //  1 or 2 digits
                      let regexD = try! NSRegularExpression(pattern: patternD)
                      if let matchD = regexD.firstMatch(in: aDate, range: NSRange(5..<adate.utf16.count)) { ="" start="" after="" the="" first="" -="" to="" skip="" it<br="">                let dStr = String(aDate[Range(matchD.range(at: 0), in: aDate)!]).dropFirst()
                          day = Int(dStr) ?? 0
                      }
                  }
                  return (year, month, day)
              } else {
                  print("No match")
                  return (0, 0, 0)
              }
          }
          parser(aDate: "2019-1-19")
          
          let array = ["2019-1-10","2015-4-2","2010-11-21", "2016-11-22", "2019-4-3", "2015-5-3"]
          let newArray = array.map() { parser(aDate: $0)}
          let sorted = newArray.sorted(by: { ($0.y,$0.m,$0.d) >= ($1.y, $1.m, $1.d)})
          let orderedArray = sorted.map() { String($0.y) + "-" + String($0.m) + "-" + String($0.d) }
          print(orderedArray)
          • Re: How to sort array of dates as string?
            OOPer Level 7 Level 7 (4,725 points)

            First of all, you should delete the duplicate question.

             

            The title is a little bit confusing, but I guess you want to sort an Array of date String, with comparison as date.

             

            One simple way is converting String to Date, for comparison:

            let array = ["2019-1-10","2010-2-3","2015-4-2","2010-11-21"]
            let df = DateFormatter()
            df.dateFormat = "yyyy-MM-dd"
            df.locale = Locale(identifier: "en_US_POSIX")
            df.timeZone = TimeZone(identifier: "UTC")!
            
            let sortedArray = array.sorted {df.date(from: $0)! > df.date(from: $1)!}
            print(sortedArray) //->["2019-1-10", "2015-4-2", "2010-11-21", "2010-2-3"]
            
            

             

            Another way, you may use numeric comparison available in Foundation.

            let array = ["2019-1-10","2010-2-3","2015-4-2","2010-11-21"]
            
            let sortedArray = array.sorted {$0.compare($1, options: .numeric) == .orderedDescending}
            print(sortedArray) //->["2019-1-10", "2015-4-2", "2010-11-21", "2010-2-3"]
            
            

             

            But, generally, date is sort of meta-info of some other things and it rarely happens that an Array of date String appears independently in actual apps. If you can provide more context about why you need to sort such an Array, you would get better responses.