Je veux trier un dictionnaire dans Swift. J'ai un dictionnaire comme:
"A" => Array[]
"Z" => Array[]
"D" => Array[]
etc. Je veux que ce soit comme
"A" => Array[]
"D" => Array[]
"Z" => Array[]
etc.
J'ai essayé beaucoup de solutions sur SO mais personne n'a travaillé pour moi. J'utilise XCode6 Bêta 5 et certains donnent une erreur de compilation et certaines solutions donnent des exceptions. Donc, tous ceux qui peuvent poster la copie de travail du tri par dictionnaire.
let dictionary = [
"A" : [1, 2],
"Z" : [3, 4],
"D" : [5, 6]
]
let sortedKeys = Array(dictionary.keys).sorted(<) // ["A", "D", "Z"]
EDIT:
Le tableau trié du code ci-dessus contient uniquement des clés, tandis que les valeurs doivent être extraites du dictionnaire d'origine. Cependant, 'Dictionary'
est également un 'CollectionType'
de paires (clé, valeur) et nous pouvons utiliser la fonction globale 'sorted'
pour obtenir un tableau trié contenant à la fois des clés et des valeurs, comme ceci:
let sortedKeysAndValues = sorted(dictionary) { $0.0 < $1.0 }
println(sortedKeysAndValues) // [(A, [1, 2]), (D, [5, 6]), (Z, [3, 4])]
EDIT2: La syntaxe mensuelle Swift qui change tous les mois préfère actuellement
let sortedKeys = Array(dictionary.keys).sort(<) // ["A", "D", "Z"]
Le global sorted
est obsolète.
Version mise à jour de la réponse d'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 })
Avis:
Certains d'entre vous semblent surpris que le tableau résultant ne soit pas un dictionnaire. Les dictionnaires ne peuvent pas être triés! Le type de données résultant est un tableau trié, comme dans la réponse de @ Ivica.
Si vous souhaitez parcourir les clés et les valeurs dans un ordre trié, ce formulaire est assez succinct.
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)")
}
Dans Swift 4, vous pouvez l'écrire plus intelligemment:
let d = [ 1 : "hello", 2 : "bye", -1 : "foo" ]
d = [Int : String](uniqueKeysWithValues: d.sorted{ $0.key < $1.key })
J'ai essayé tout ce qui précède, en un mot, tout ce dont vous avez besoin est
let sorted = dictionary.sorted { $0.key < $1.key }
let keysArraySorted = Array(sorted.map({ $0.key }))
let valuesArraySorted = Array(sorted.map({ $0.value }))
Pour Swift 3, le tri suivant renvoie le dictionnaire trié par clé:
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"]
Pour Swift 4, les éléments suivants ont fonctionné pour moi:
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
}
"triés" dans iOS 9 & xcode 7.3, Swift 2.2 est impossible, remplacez "trié" par "trié", comme ceci:
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]
Pour Swift 3, les éléments suivants ont fonctionné pour moi et la syntaxe Swift 2 n'a pas fonctionné:
// 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 trié (par: <)
let dictionary = [
"A" : [1, 2],
"Z" : [3, 4],
"D" : [5, 6]
]
let sortedKeys = Array(dictionary.keys).sorted(by:<) // ["A", "D", "Z"]
C'est une alternative élégante au tri du dictionnaire lui-même:
à partir de Swift 4 & 5
let sortedKeys = myDict.keys.sorted()
for key in sortedKeys {
// Ordered iteration over the dictionary
let val = myDict[key]
}