Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct Account {
- let currencyCode: String
- let openDate: Date
- }
- let currencyCodes = ["RUR", "USD", "EUR"]
- func sortedAccounts(_ accounts: [Account]) -> [Account] {
- var dates: [String: NSMutableOrderedSet] = [:]
- var duplicates: [String: [Date: Int]] = [ // it's not clear wether we can have identical records in array so...
- "RUR": [:],
- "USD": [:],
- "EUR": [:]
- ]
- for account in accounts {
- let set = dates[account.currencyCode] ?? NSMutableOrderedSet()
- if set.contains(account.openDate) {
- var counts = duplicates[account.currencyCode]
- let count = counts?[account.openDate] ?? 0
- counts?[account.openDate] = count + 1
- }
- set.add(account.openDate)
- dates[account.currencyCode] = set
- }
- var result: [Account] = []
- for code in currencyCodes {
- guard
- let set = dates[code],
- let array = Array(set) as? [Date] else {
- continue
- }
- for date in array {
- let duplicatesForCode = duplicates[code]
- let duplicatesCount = duplicatesForCode?[date] ?? 0
- (0..<duplicatesCount + 1).forEach { _ in
- result.append(Account(currencyCode: code, openDate: date))
- }
- }
- }
- return result
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement