2016-09-07 24 views
1

所以我有一個基於時間屬性的對象數組。不幸的是,時間屬性是以非常格式化的字符串形式給出的。即下午6點,上午10點,上午7點按非時間格式排序時間對象數組

+0

@ sudomakeinstall2,這只是甚至還沒有接近 – WMios

+0

我建議你將其分爲兩個部分。首先解析時間,然後排序。 – Alexander

回答

1

我建議將這些對象轉換爲NSDate對象並在此基礎上進行排序。不過,您需要爲每個可能的排列組合使用NSDateFormatters。例如:

let timeStrings = ["6pm", "10:30 am", "7 am", "1:42:00 pm"] 

let hourOnlyFormatter = NSDateFormatter() 
hourOnlyFormatter.dateFormat = "ha" 
let hourMinuteFormatter = NSDateFormatter() 
hourMinuteFormatter.dateFormat = "h:mma" 
let hmsFormatter = NSDateFormatter() 
hmsFormatter.dateFormat = "h:mm:ssa" 

let times = timeStrings.map { ($0, hourOnlyFormatter.dateFromString($0) ?? hourMinuteFormatter.dateFromString($0) ?? hmsFormatter.dateFromString($0)!) } 
    .sort { $0.1.compare($1.1) == .OrderedAscending } 
    .map { $0.0 } 

這將產生

[ 「上午7點」, 「10:30」, 「下午1時42分00秒」, 「18:00」]


或者,如果你想要一個更一致的輸出,設計爲輸出格式:

let outputFormatter = NSDateFormatter() 
outputFormatter.timeStyle = .ShortStyle 

然後你就可以使用,建立結果時:

let times = timeStrings.map { ($0, hourOnlyFormatter.dateFromString($0) ?? hourMinuteFormatter.dateFromString($0) ?? hmsFormatter.dateFromString($0)!) } 
    .sort { $0.1.compare($1.1) == .OrderedAscending } 
    .map { outputFormatter.stringFromDate($0.1) } 

其中產量:

[ 「7:00 AM」, 「10:30」, 「下午1:42」 「6:00 PM」]

+1

這是一個高質量的答案。 – WMios

0

我寫了一個小功能,可以同時作爲格式類型String的日期進行排序:

"#xm" 
"# xm" 
"##:##xm" 
"##:## xm" 

其中#是一個數字,​​是ampm

檢查出來:

func formattedTime(currentTime:String) -> Int{ 

    var time = 0 

    let length = currentTime.characters.count 
    let ampm = String(currentTime.characters.suffix(2)) 


    var nsCurrentTime = currentTime as NSString 
    nsCurrentTime = nsCurrentTime.substringWithRange(NSRange(location: 0, length: length-2)).stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) 

    if nsCurrentTime.containsString(":"){ 
     let arr = nsCurrentTime.componentsSeparatedByString(":") 
     time += Int(arr[0])!*60 + Int(arr[1])! 
    } else { 
     time += nsCurrentTime.integerValue * 60 

    } 


    if ampm == "pm" { 
     time += 12*60 
    } 

    return time 
} 

let unsorted = ["7:30 pm", "7pm", "4am", "2:15pm", "3:16am"] 

let sorted = unsorted.sort({a, b in formattedTime(a) < formattedTime(b)}) 

print(sorted) 

它打印:

"["3:16am", "4am", "2:15pm", "7pm", "7:30 pm"]\n"