[英]Sorting a list of time string ranges in swift
我在字符串數組中共有 9 個元素。
strArr = [ "1 days ago","10 hours ago","2 hours ago","3 days ago","3 hours ago","4 hours ago",
"5 hours ago","6 hours ago","7 hours ago"]
我需要像這樣對數組進行排序
sortedArr = ["2 hours ago","3 hours ago","4 hours ago","5 hours ago",
"6 hours ago","7 hours ago","10 hours ago", "1 days ago","3 days ago"]
你可以做到3個步驟:
- 創建一個 model 值來表示一個句子
- 使 model 值具有可比性
- 將每個句子轉換為 model 值
- 對 model 值進行排序
- 將每個 model 值再次轉化為一句話
枚舉是表示一般句子的好方法
enum TimePoint {
case hours(Int)
case days(Int)
init?(sentence: String) {
let tokens = sentence.split(separator: " ")
guard
tokens.count == 3,
let firstToken = tokens.first,
let value = Int(firstToken)
else { return nil }
let unitString = String(tokens[1])
switch unitString {
case "hours": self = .hours(value)
case "days": self = .days(value)
default: return nil
}
}
var description: String {
switch self {
case .days(let value): return "\(value) days ago"
case .hours(let value): return "\(value) hours ago"
}
}
}
extension TimePoint: Comparable {
private var hours: Int {
switch self {
case .hours(let value): return value
case .days(let value): return 24 * value
}
}
static func < (lhs: TimePoint, rhs: TimePoint) -> Bool {
return lhs.hours < rhs.hours
}
}
給定這個輸入數組
let sentences = ["1 days ago","10 hours ago","2 hours ago","3 days ago","3 hours ago","4 hours ago", "5 hours ago","6 hours ago","7 hours ago"]
你現在可以寫
let sortedSentences = sentences
.compactMap(TimePoint.init)
.sorted()
.map { $0.description }
而已
["2 hours ago", "3 hours ago", "4 hours ago", "5 hours ago", "6 hours ago", "7 hours ago", "10 hours ago", "1 days ago", "3 days ago"]
如果您的字符串集合是一致的,您可以只傳遞一個自定義排序謂詞。 如果前一個元素具有小時后綴,並且下一個元素不只是返回 true,否則返回localizedStandardCompare
比較結果
let strings = [ "1 days ago","10 hours ago","2 hours ago","3 days ago","3 hours ago","4 hours ago",
"5 hours ago","6 hours ago","7 hours ago"]
let sorted = strings.sorted{ $0.hasSuffix(" hours ago") && !$1.hasSuffix(" hours ago") ? true : $0.localizedStandardCompare($1) == .orderedAscending }
print(sorted) // ["2 hours ago", "3 hours ago", "4 hours ago", "5 hours ago", "6 hours ago", "7 hours ago", "10 hours ago", "1 days ago", "3 days ago"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.