2017-05-13 9 views
2

私はコードの中に一連の文字列を持っています。このような何か:月と年を表す文字列の配列をソートする方法は?

let arrayOfMonths = ["May 2017", "January 2018", "August 2016", "January 2015", "June 2017"] 

私は月と年の古典的な連続をたどってソートこと、したいと思いますので、私はこのような出力が欲しい:

let sortedArrayOfMonths = ["January 2015", "August 2016", "May 2017", "June 2017", "January 2018"] 

どのようにすることができます私はスイフト3でそれをしますか?ありがとう。

+2

がDate' 'に文字列を変換し、それらを並べ替えます。 – vadian

+0

完全なDateオブジェクトは必要ありません。文字列のみを並べ替える必要があります。 –

答えて

0

私はもう少し調べて、Swift 3で ".sorted()"メソッドを見つけましたので、私の解決策を作りました。 「名前」プロパティと「年」プロパティで、私はオブジェクトの月使います、

let monthForNumber = ["January":1, "February":2, "March":3, "April":4, "May":5, "June":6, "July":7, "August":8, "September":9, "October":10, "November":11, "December":12] 

をsemplicityについては、私が「月」の構造体を作成しました::

let month_1 = Month.init(name: "May", year: 2016) 
let month_2 = Month.init(name: "April", year: 2010) 
let month_3 = Month.init(name: "April", year: 2009) 
let month_4 = Month.init(name: "January", year: 2026) 
let month_5 = Month.init(name: "June", year: 2016) 

let unsortedMonthsArray = [Month]() 
unsortedMonthsArray.append(month_1) 
unsortedMonthsArray.append(month_2) 
unsortedMonthsArray.append(month_3) 
unsortedMonthsArray.append(month_4) 
unsortedMonthsArray.append(month_5) 

let sortedArrayOfMonths = self.unsortedMonthsArray?.sorted(by: { (month1, month2) -> Bool in 
     if self.monthForNumber[month1.name!] != self.monthForNumber[month2.name!] { 
      if month1.year != month2.year { 
       return month1.year < month2.year 
      } else { 
       return self.monthForNumber[month1.name!]! < self.monthForNumber[month2.name!]! 
      } 
     } else { 
      if month1.year != month2.year { 
       return month1.year < month2.year 
      } else { 
       return self.monthForNumber[month1.name!]! < self.monthForNumber[month2.name!]! 
      } 
     } 
    }) 
を私は誰かが必要とする場合には投稿します

このソリューションは、文字列の配列( "monthName_monthYear")に簡単に変換できるMonthsのソートされた配列を提供します。

3

単に

let formatter : DateFormatter = { 
    let df = DateFormatter() 
    df.locale = Locale(identifier: "en_US_POSIX") 
    df.dateFormat = "MMMM yyyy" 
    return df 
}() 

let arrayOfMonths = ["May 2017", "January 2018", "August 2016", "January 2015", "June 2017"] 

let sortedArrayOfMonths = arrayOfMonths.sorted(by: { formatter.date(from: $0)! < formatter.date(from: $1)! }) 
+0

私はそれを知らなかった.dateFormat(MMMM yyyy)、素晴らしい解決策、ありがとう! –

+0

私にとっても完璧に機能します。ありがとう。 – skJosh

0

また、この行っている可能性がないのはなぜ:

let sortedMonths = arrayOfMonths.map{($0,$0.components(separatedBy:" "))} 
        .map{($0,$1[1]+"\(Calendar.current.monthSymbols.index(of: $1[0])!+10)")} 
        .sorted{$0.1<$1.1} 
        .map{$0.0} 
関連する問題