iOS 賬單數(shù)據(jù)處理

簡化一下模型,一般來說服務(wù)器返回的都是按時間順序排好的數(shù)組(unsorted),排序后如result所示。

    var result: Array<Any> = []
    /// 里面代表月份
    let unsorted = [9, 9, 9, 8, 8, 7, 6, 6, 5, 4, 4, 1]
    billSort(unsorted)
    /// 輸出結(jié)果
    result = [[9, 9, 9], [8, 8], [7], [6, 6], [5], [4, 4], [1]]

關(guān)鍵代碼:

var result: Array<Any> = []
/// 用于保存上一次排序的月份,以便接下來比較
var olderValue: Int?
func billSort(_ a: [Int]) {
    guard a.count > 1 else {
        result.append(a)
        return
    }

    olderValue = a.first
    /// 取出同月份的數(shù)據(jù)
    let currentMonth = a.filter{ $0 == olderValue }
    result.append(currentMonth)
    /// 取出不同月份的數(shù)據(jù)進行下一次比較
    let rest = a.filter{ $0 != olderValue }
    
    /// 判斷是否還有未排序
    if rest.isEmpty == false {
        olderValue = rest.first
        billSort(rest)
    }
}

let unsorted = [9, 9, 9, 8, 8, 7, 6, 6, 5, 4, 4, 1]
billSort(unsorted)
print(result)
// result = [[9, 9, 9], [8, 8], [7], [6, 6], [5], [4, 4], [1]]

實際情況只需要將判定的條件換為是否同月。完整代碼如下:

class BillModel {
    var timeStamp: Double?
    var money: Double?
    
    init(_ time: Double, money: Double) {
        self.timeStamp = time
        self.money = money
    }
}

func creatBill() -> [BillModel] {
    var currentTime = NSDate().timeIntervalSince1970
    var bills: [BillModel] = []
    for x in 0 ..< 10 {
        let bill = BillModel.init(currentTime, money: Double(x))
        bills.append(bill)
        currentTime -= 1000000
    }
    return bills
}

func isTheSameMonth(_ a: Double, b: Double) -> Bool {
    let aDate = Date.init(timeIntervalSince1970: a)
    let bDate = Date.init(timeIntervalSince1970: b)
    let aM = Calendar.current.dateComponents([.month], from: aDate)
    let bM = Calendar.current.dateComponents([.month], from: bDate)
    
    return aM.month == bM.month && aM.year == bM.year
}

var result: Array<Any> = []
var olderValue: BillModel?
func billSort(_ a: [BillModel]) {
    guard a.count > 1 else {
        result.append(a)
        return
    }
    
    olderValue = a.first
    let currentMonth = a.filter{ isTheSameMonth($0.timeStamp!, b: (olderValue?.timeStamp)!) }
    print(currentMonth)
    result.append(currentMonth)
    let rest = a.filter{ !isTheSameMonth($0.timeStamp!, b: (olderValue?.timeStamp)!) }
    
    if rest.isEmpty == false {
        olderValue = rest.first
        billSort(rest)
    }
}

let bills = creatBill()
billSort(bills)
print(result)

相關(guān)代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,674評論 0 4
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,638評論 18 399
  • 首頁 資訊 文章 資源 小組 相親 登錄 注冊 首頁 最新文章 IT 職場 前端 后端 移動端 數(shù)據(jù)庫 運維 其他...
    Helen_Cat閱讀 4,151評論 1 10
  • 一事無成的人,很多地方都是相似的。 1. 缺席 百分之八十的成功來自于出席?!榈稀ぐ瑐?更多的出席——這是在生...
    非常高效閱讀 61,414評論 87 2,047
  • 生活對每個人公平,每個人有不同的選擇,而因選擇的不同又有了不同的生活。這種不同的選擇,源于性格,源于經(jīng)歷,源于身邊...
    林夕楓起閱讀 318評論 2 8

友情鏈接更多精彩內(nèi)容