#swift #sorting #dictionary
#swift #сортировка #словарь
Вопрос:
У меня есть диктофон, который выглядит следующим образом:
var dict = [Int: [String: Any]]()
dict[1] = ["nausea": 23, "other": "hhh"]
dict[2] = ["nausea": 3, "other": "kkk"]
dict[3] = ["nausea": 33, "other" : "yyy"]
Я хочу отсортировать словарь по значению значения словаря для ключа «тошнота» от наименьшего к наибольшему.
Чтобы выглядеть так:
sortedDict = [2: ["nausea": 3, "other": "kkk"], 1: ["nausea": 23, "other": "hhh"], 3: ["nausea": 33, "other" : "yyy"]]
Я попытался поиграть с ним, используя .sort():
let sortedDict = dict.sort( { ($0["nausea"] as! Int) > ($1["nausea"] as! Int) })
но, очевидно, это не сработало, потому что «тошнота» не является ключом к диктонарию
Может кто-нибудь показать мне, как они это сделают? Заранее спасибо!
Комментарии:
1. Словарь — это неупорядоченная структура данных. Если вам нужен порядок, вам придется использовать массив.
Ответ №1:
A Dictionary
неупорядочен по дизайну, как четко указано в документации:
Каждый словарь представляет собой неупорядоченную коллекцию пар ключ-значение.
Вероятно, вы ищете упорядоченный тип, например Array
.
var arrayDict = [
["nausea": 23, "other": "hhh"],
["nausea": 3, "other": "kkk"],
["nausea": 33, "other" : "yyy"]
]
let sorted = arrayDict.sorted { $0["nausea"] as! Int < $1["nausea"] as! Int }
print(sorted)
Обновление: еще лучше, как предложил @LeoDabus в комментарии, вы можете использовать массив пользовательских объектов:
struct MyObject {
var nausea: Int
var other: String
}
var array = [
MyObject(nausea: 23, other: "hhh"),
MyObject(nausea: 3, other: "kkk"),
MyObject(nausea: 33, other: "yyy")
]
let sorted = array.sorted { $0.nausea < $1.nausea }
print(sorted)
Комментарии:
1. Это все еще уродливый подход. OP должен использовать массив пользовательских объектов.
2. @LeoDabus Я обновил свой ответ. Вы совершенно правы, это гораздо элегантнее.
3. @leoDabus Да, это правда. Только что внедрил его в свое приложение, и это также устраняет другую проблему моего вчерашнего второго поста. Приношу свои извинения за это…