Сортировка словаря [Ключ: [Ключ: значение]] по значению — Swift

#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 Да, это правда. Только что внедрил его в свое приложение, и это также устраняет другую проблему моего вчерашнего второго поста. Приношу свои извинения за это…