Свифт получи максимальный ключ от и сортируй - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть var dataDictionary = [[String:Any]]() и данные внутри:

[["quant": 10, "name": "..."], 
["quant": 20, "name": "..."], 
["quant": 25, "name": "..."],
["quant": 27, "name": "..."],
["quant": 30, "name": "..."],
["quant": 30, "name": "..."],
["quant": 20, "name": "..."],
["quant": 40, "name": "..."],
["quant": 15, "name": "..."],
...]

Я хочу получить max из всех «количественных», а затем создать func, чтобы сделать выбор int для maxKey и напечатать Например, нужно получить от 30 до maxKey и получить:

[["quant": 30, "name": "..."],
["quant": 30, "name": "..."],
["quant": 40, "name": "..."]]

Я пытаюсь получить максимум, как это:

let maxVal = dataDictionary.max { a, b in a.value < b.value }

но есть ошибка

Значение типа '[String: Any]' не имеет члена 'value'

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

В вашем проверенном механизме

let maxVal = dataDictionary.max { a, b in a.value < b.value }

a, b являются словарями типа [String: Any], которые не имеют .values свойств.Таким образом, чтобы найти словарь максимального количества, вы должны использовать:

let maxVal = dataDictionary.max { a, b in (a["quant"] as! Int) < (b["quant"] as! Int) }

Если вы хотите получить все словари, у которых квант больше или равен конкретному значению, вы должны использовать:

let quantLimit: Int = 30
let maxValFrom30 = dataDictionary.filter({ ($0["quant"] as! Int) >= quantLimit })
0 голосов
/ 18 сентября 2018

попробуйте

 dataDictionary.sort { (v1, v2) -> Bool in
  return v1["quant"] as? Int ?? 0 <  v2["quant"] as? Int ?? 0
}
let min = 30
let max = dataDictionary.last!["quant"] as? Int ?? min
let filtered = dataDictionary.filter({(dict) in
  let valueToCompare = dict["quant"] as! Int
  return valueToCompare >= min && valueToCompare <= max
})
print(filtered)
0 голосов
/ 18 сентября 2018

Вы должны получить доступ к "quant" значению через подписку:

var dataDictionary = [[String:Any]]()
let maxVal = dataDictionary.max { (lhs, rhs) -> Bool in
    let leftValue = lhs["quant"] as? Int ?? 0
    let rightValue = rhs["quant"] as? Int ?? 0
    return leftValue < rightValue
}
0 голосов
/ 18 сентября 2018

Вы делаете max на array, поэтому вам нужно получить доступ к количеству с keyValue pair следующим образом:

    dataDictionary.max { (a, b) -> Bool in
        return a["quant"] as! Int > b["quant"] as! Int
        //Or with optional
        return a["quant"] as? Int ?? 0 > b["quant"] as? Int ?? 0

     }

В противном случае, когда вы делаете это на [String: Any], вы можетеделай так же, как и ты

let greatestDict = dataDictionary.max { a, b in a.value < b.value }
print(greatestDict)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...