Сортировка словаря по ключам
Я хочу сортировать словарь в Swift. У меня есть словарь вроде:
"A" => Array[]
"Z" => Array[]
"D" => Array[]
и т.д.. Я хочу, чтобы это было как
"A" => Array[]
"D" => Array[]
"Z" => Array[]
и др.
Я пробовал много решений на SO, но никто не работал у меня. Я использую XCode6 Beta 5, и на этом некоторые из них дают ошибку компилятора, а некоторые решения предоставляют исключения. Итак, любой, кто может опубликовать рабочую копию сортировки словаря.
Ответы
Ответ 1
let dictionary = [
"A" : [1, 2],
"Z" : [3, 4],
"D" : [5, 6]
]
let sortedKeys = Array(dictionary.keys).sorted(<) // ["A", "D", "Z"]
EDIT:
Сортированный массив из приведенного выше кода содержит только ключи, а значения должны извлекаться из исходного словаря. Однако 'Dictionary'
также является 'CollectionType'
парами (ключ, значение), и мы можем использовать глобальную функцию 'sorted'
, чтобы получить отсортированный массив, содержащий оба ключа и значения, например:
let sortedKeysAndValues = sorted(dictionary) { $0.0 < $1.0 }
println(sortedKeysAndValues) // [(A, [1, 2]), (D, [5, 6]), (Z, [3, 4])]
EDIT2: Ежемесячно изменяющийся синтаксис Swift в настоящее время предпочитает
let sortedKeys = Array(dictionary.keys).sort(<) // ["A", "D", "Z"]
Глобальная sorted
устарела.
Ответ 2
Swift 2.0
Обновленная версия ответа Ivica M:
let wordDict = [
"A" : [1, 2],
"Z" : [3, 4],
"D" : [5, 6]
]
let sortedDict = wordDict.sort { $0.0 < $1.0 }
print("\(sortedDict)") //
Swift 3
wordDict.sorted(by: { $0.0 < $1.0 })
Примечание:
Некоторые из вас, похоже, удивлены тем, что результирующий массив не является словарем. Словари нельзя сортировать! Результирующий тип данных представляет собой отсортированный массив, как и в ответе @Ivica.
Ответ 3
Если вы хотите итерации по клавишам и значениям в сортированном порядке ключей, эта форма является довольно кратким
let d = [
"A" : [1, 2],
"Z" : [3, 4],
"D" : [5, 6]
]
for (k,v) in Array(d).sorted({$0.0 < $1.0}) {
println("\(k):\(v)")
}
Ответ 4
В быстром 4 вы можете написать умнее:
let d = [ 1 : "hello", 2 : "bye", -1 : "foo" ]
d = [Int : String](uniqueKeysWithValues: d.sorted{ $0.key < $1.key })
Ответ 5
Я пробовал все вышеперечисленное, в двух словах все, что вам нужно, это
let sorted = dictionary.sorted { $0.key < $1.key }
let keysArraySorted = Array(sorted.map({ $0.key }))
let valuesArraySorted = Array(sorted.map({ $0.value }))
Ответ 6
Для Swift 3 следующий вид возвращает отсортированный словарь по клавишам:
let unsortedDictionary = ["4": "four", "2": "two", "1": "one", "3": "three"]
let sortedDictionary = unsortedDictionary.sorted(by: { $0.0.key < $0.1.key })
print(sortedDictionary)
// ["1": "one", "2": "two", "3": "three", "4": "four"]
Ответ 7
Для Swift 4 для меня работало следующее:
let dicNumArray = ["q":[1,2,3,4,5],"a":[2,3,4,5,5],"s":[123,123,132,43,4],"t":[00,88,66,542,321]]
let sortedDic = dicNumArray.sorted { (aDic, bDic) -> Bool in
return aDic.key < bDic.key
}
Ответ 8
"отсортировано" в iOS 9 и xcode 7.3, swift 2.2 невозможно, измените "отсортированный" на "сортировать", например:
let dictionary = ["main course": 10.99, "dessert": 2.99, "salad": 5.99]
let sortedKeysAndValues = Array(dictionary).sort({ $0.0 < $1.0 })
print(sortedKeysAndValues)
//sortedKeysAndValues = ["desert": 2.99, "main course": 10.99, "salad": 5.99]
Ответ 9
Для Swift 3 для меня работало следующее, а синтаксис Swift 2 не работал:
// menu is a dictionary in this example
var menu = ["main course": 10.99, "dessert": 2.99, "salad": 5.99]
let sortedDict = menu.sorted(by: <)
// without "by:" it does not work in Swift 3
Ответ 10
Swift 3 сортируется (по: <)
let dictionary = [
"A" : [1, 2],
"Z" : [3, 4],
"D" : [5, 6]
]
let sortedKeys = Array(dictionary.keys).sorted(by:<) // ["A", "D", "Z"]
Ответ 11
Это элегантная альтернатива сортировке самого словаря:
По состоянию на Свифт 4 и 5
let sortedKeys = myDict.keys.sorted()
for key in sortedKeys {
// Ordered iteration over the dictionary
let val = myDict[key]
}