web-dev-qa-db-fra.com

Trier le dictionnaire par clés

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.

110
Aleem Ahmad
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.

140
Ivica M.

Swift 2.0

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)") // 

Swift 3

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.

100
Dan Beaulieu

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)")
}
25
rks

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 })
13
Davide Gianessi

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 }))
9
Elsammak

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"]
4
Arijan

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
}
4
Shiv Kumar

"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]
3
AmyNguyen

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
1
Joeri

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"]
1
Shadros

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]
}
0
ThunderStruct