簡體   English   中英

對 swift 中的時間字符串范圍列表進行排序

[英]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個步驟:

  1. 創建一個 model 值來表示一個句子
  2. 使 model 值具有可比性
  3. 將每個句子轉換為 model 值
  4. 對 model 值進行排序
  5. 將每個 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"
        }
    }
}

第 2 步:使 model 值具有可比性

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
    }
}

第三、四、五步(轉換為model,排序再轉換為文本)

給定這個輸入數組

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM