Quiero ordenar un diccionario en Swift. Tengo un diccionario como:
"A" => Array[] "Z" => Array[] "D" => Array[]
etc. Quiero que sea como
"A" => Array[] "D" => Array[] "Z" => Array[]
etc.
He intentado muchas soluciones en SO, pero nadie trabajó para mí. Estoy usando XCode6 Beta 5 y algunos están dando error de comstackción y algunas soluciones están dando excepciones. Entonces, cualquiera que pueda publicar la copia de trabajo de clasificación de diccionarios.
let dictionary = [ "A" : [1, 2], "Z" : [3, 4], "D" : [5, 6] ] let sortedKeys = Array(dictionary.keys).sorted(<) // ["A", "D", "Z"]
EDITAR:
La matriz ordenada del código anterior solo contiene claves, mientras que los valores deben recuperarse del diccionario original. Sin embargo, 'Dictionary'
también es un 'CollectionType'
de pares (clave, valor) y podemos usar la función global 'sorted'
para obtener una matriz ordenada que contenga tanto claves como valores, como esta:
let sortedKeysAndValues = sorted(dictionary) { $0.0 < $1.0 } println(sortedKeysAndValues) // [(A, [1, 2]), (D, [5, 6]), (Z, [3, 4])]
EDIT2: la syntax cambiante mensual de Swift actualmente prefiere
let sortedKeys = Array(dictionary.keys).sort(<) // ["A", "D", "Z"]
El sorted
global está en desuso.
Versión actualizada de la respuesta de Ivica M:
let wordDict = [ "A" : [1, 2], "Z" : [3, 4], "D" : [5, 6] ] let sortedDict = wordDict.sort { $0.0 < $1.0 } print("\(sortedDict)") //
wordDict.sorted(by: { $0.0 < $1.0 })
Darse cuenta:
Algunos de ustedes parecen sorprendidos de que la matriz resultante no sea un diccionario. ¡Los diccionarios no pueden ser ordenados ! El tipo de datos resultante es una matriz ordenada, al igual que en la respuesta de @ Ivica.
Si desea iterar sobre las claves y los valores en un orden clave ordenado, este formulario es bastante breve
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)") }
En swift 4 puedes escribirlo de manera más inteligente:
let d = [ 1 : "hello", 2 : "bye", -1 : "foo" ] d = [Int : String](uniqueKeysWithValues: d.sorted{ $0.key < $1.key })
“ordenado” en iOS 9 y xcode 7.3, swift 2.2 es imposible, cambie “ordenado” a “ordenar”, así:
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]
Para Swift 3, el siguiente tipo devuelve el diccionario ordenado por claves:
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"]
Intenté todo lo anterior, en resumen, todo lo que necesitas es
let sorted = dictionary.sorted { $0.key < $1.key } let keysArraySorted = Array(sorted.map({ $0.key })) let valuesArraySorted = Array(sorted.map({ $0.value }))
Para Swift 4, lo siguiente me ha funcionado:
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 }
Para Swift 3, lo siguiente me ha funcionado y la syntax de Swift 2 no ha funcionado:
// 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
Swift 3 está clasificado (por: <)
let dictionary = [ "A" : [1, 2], "Z" : [3, 4], "D" : [5, 6] ] let sortedKeys = Array(dictionary.keys).sorted(by:<) // ["A", "D", "Z"]