Advertisement
Guest User

Untitled

a guest
Jul 20th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 1.39 KB | None | 0 0
  1. struct Account {
  2.     let currencyCode: String
  3.     let openDate: Date
  4. }
  5.  
  6. let currencyCodes = ["RUR", "USD", "EUR"]
  7.  
  8. func sortedAccounts(_ accounts: [Account]) -> [Account] {
  9.    
  10.     var dates: [String: NSMutableOrderedSet] = [:]
  11.     var duplicates: [String: [Date: Int]] = [ // it's not clear wether we can have identical records in array so...
  12.         "RUR": [:],
  13.         "USD": [:],
  14.         "EUR": [:]
  15.     ]
  16.    
  17.     for account in accounts {
  18.         let set = dates[account.currencyCode] ?? NSMutableOrderedSet()
  19.         if set.contains(account.openDate) {
  20.             var counts = duplicates[account.currencyCode]
  21.             let count = counts?[account.openDate] ?? 0
  22.             counts?[account.openDate] = count + 1
  23.         }
  24.         set.add(account.openDate)
  25.         dates[account.currencyCode] = set
  26.     }
  27.    
  28.     var result: [Account] = []
  29.    
  30.     for code in currencyCodes {
  31.        
  32.         guard
  33.             let set = dates[code],
  34.             let array = Array(set) as? [Date] else {
  35.             continue
  36.         }
  37.        
  38.         for date in array {
  39.             let duplicatesForCode = duplicates[code]
  40.             let duplicatesCount = duplicatesForCode?[date] ?? 0
  41.            
  42.             (0..<duplicatesCount + 1).forEach { _ in
  43.                 result.append(Account(currencyCode: code, openDate: date))
  44.             }
  45.         }
  46.     }
  47.    
  48.     return result
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement