Wörterbuch nach Schlüsseln sortieren

128

Ich möchte ein Wörterbuch in Swift sortieren. Ich habe ein Wörterbuch wie:

"A" => Array[]
"Z" => Array[]
"D" => Array[]

usw. Ich möchte, dass es so ist

"A" => Array[]
"D" => Array[]
"Z" => Array[]

etc.

Ich habe viele Lösungen für SO ausprobiert, aber niemand hat für mich gearbeitet. Ich verwende XCode6 Beta 5 und einige geben Compilerfehler und einige Lösungen geben Ausnahmen. Also jeder, der die Arbeitskopie der Wörterbuchsortierung posten kann.

Aleem Ahmad
quelle
6
Sie können ein Wörterbuch nicht sortieren, es ist ein assoziativer Container. Wenn Sie eine bestimmte Reihenfolge benötigen, kopieren Sie die Schlüssel in ein Array und sortieren Sie sie. Dann iterieren Sie über die Tasten und ziehen Sie die entsprechenden Werte.
Dasblinkenlight
@dasblinkenlight Kannst du mir also sagen, wie man ein Array schnell sortiert?
Aleem Ahmad
@AleemAhmad Schauen Sie sich diese Antwort an , sie hat sortedKeysFunktion.
Dasblinkenlight
@dasblinkenlight Ich habe dies versucht, aber es gibt Fehler auf [KeyType]
Aleem Ahmad

Antworten:

167
let dictionary = [
    "A" : [1, 2],
    "Z" : [3, 4],
    "D" : [5, 6]
]

let sortedKeys = Array(dictionary.keys).sorted(<) // ["A", "D", "Z"]

BEARBEITEN:

Das sortierte Array aus dem obigen Code enthält nur Schlüssel, während Werte aus dem ursprünglichen Wörterbuch abgerufen werden müssen. Es handelt sich jedoch 'Dictionary'auch um ein 'CollectionType'(Schlüssel-, Wert-) Paar, und wir können die globale 'sorted'Funktion verwenden, um ein sortiertes Array zu erhalten, das sowohl Schlüssel als auch Werte enthält, wie folgt:

let sortedKeysAndValues = sorted(dictionary) { $0.0 < $1.0 }
println(sortedKeysAndValues) // [(A, [1, 2]), (D, [5, 6]), (Z, [3, 4])]

EDIT2: Die monatlich wechselnde Swift-Syntax wird derzeit bevorzugt

let sortedKeys = Array(dictionary.keys).sort(<) // ["A", "D", "Z"]

Das Globale sortedist veraltet.

Ivica M.
quelle
Dies gibt Ihnen eine Reihe von Schlüsseln. Dem Array fehlen die Werte. Sie könnten die Werte aus dem Wörterbuch nachschlagen, denke ich.
StilesCrisis
2
Du hast recht. Ich habe den Beitrag gerade bearbeitet, um eine Lösung für das Sortieren eines Arrays von (Schlüssel-, Wert-) Paaren nach Schlüsseln bereitzustellen. Danke für den Kommentar.
Ivica M.
@ IvicaM. Hallo! Ich habe verstanden, wie ich das Wörterbuch nach Schlüsseln sortieren kann, aber ich verstehe nicht, wie ich eine Reihe von Elementen im Wörterbuch sortieren kann. Bitte hilf mir. Zum Beispiel private var Kontakte: [(String, [User])] = []
Alexander Khitev
5
Swift 3 = Array (dictionary.keys) .sortiert (von: <)
miff
4
Ab Swift 4 können Sie schreibenlet sortedKeys = dictionary.keys.sorted()
Code Different
113

Swift 2.0

Aktualisierte Version der Antwort von 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 })

Beachten:

Seien Sie nicht überrascht, dass der resultierende Typ eher ein Array als ein Wörterbuch ist. Wörterbücher können nicht sortiert werden ! Der resultierende Datentyp ist ein sortiertes Array, genau wie in der Antwort von @ Ivica.

Dan Beaulieu
quelle
26
Dies gibt tatsächlich ein Array von [(String, [Int])] zurück, kein Dictionary
Scord
4
realisierte Wörterbücher sind unsortiert, daher ist es nicht sehr sinnvoll, den Datentyp trotzdem neu zu erstellen. Am Ende habe ich nur eine Reihe sortierter Schlüssel gespeichert.
Scord
Ich bekomme Binary operator > can not be compared to two Any'-Operanden. Downcasting funktioniert auch nicht
Sean
27

Wenn Sie sowohl die Schlüssel als auch die Werte in einer nach Schlüssel sortierten Reihenfolge durchlaufen möchten, ist dieses Formular recht prägnant

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)")
}
rks
quelle
sortiert ist Benutzerdefinierte Methode oder Was? es zeigt Fehler während der Implementierung
rikky
@rikkyG Swift 1: sortund sorted. Swift 2: sortist geworden sortInPlaceund sortedist geworden sort.
Eric Aya
14

In Swift 4 können Sie es intelligenter schreiben:

let d = [ 1 : "hello", 2 : "bye", -1 : "foo" ]
d = [Int : String](uniqueKeysWithValues: d.sorted{ $0.key < $1.key })
Davide Gianessi
quelle
3
Vielen Dank für die Mühe, aber zuallererst lässt das "let" den Code nicht erstellen, also muss es zuerst "var" sein. Nachdem die Kompilierung erfolgreich war, funktioniert dieser Code nicht. Er sortiert das Wörterbuch nicht. Ich erhalte das gleiche Ergebnis vor und nach dem Ausführen dieses Codes. Vielleicht fehlt mir etwas, aber bitte erläutern Sie mehr oder ändern Sie den Code. ======= var d = [1: "Hallo", 2: "Tschüss", -1: "Foo"] print (d) - >>> druckt [2: "Tschüss", -1: " foo ", 1:" hallo "] d = [Int: String] (uniqueKeysWithValues: d.sorted {$ 0.key <$ 1.key}) print (d) - >>> druckt [2:" bye ", -1 : "foo", 1: "hallo"]
KarimIhab
Es ist nicht möglich, da es beim
Zurückkonvertieren
12

Ich habe alles versucht, kurz gesagt, alles was Sie brauchen ist

let sorted = dictionary.sorted { $0.key < $1.key }
let keysArraySorted = Array(sorted.map({ $0.key }))
let valuesArraySorted = Array(sorted.map({ $0.value }))

Elsammak
quelle
6

Für Swift 4 hat Folgendes für mich funktioniert:

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
}
Shiv Kumar
quelle
5
Dies gibt kein Wörterbuch zurück, dies wird eine Reihe von Tupeln zurückgeben
Daniel Arantes Loverde
@DanielArantesLoverde Wörterbücher sind per Definition unsortierbar. Eine Reihe von Tupeln ist das Beste, was Sie tun können.
John Montgomery
1
Ich weiß das, aber die Frage fragt nach einer Bestellung, daher ist diese Antwort nicht korrekt. Sind Sie einverstanden?
Daniel Arantes Loverde
6

Dies ist eine elegante Alternative zum Sortieren des Wörterbuchs selbst:

Ab Swift 4 & 5

let sortedKeys = myDict.keys.sorted()

for key in sortedKeys {
   // Ordered iteration over the dictionary
   let val = myDict[key]
}
ThunderStruct
quelle
5

In Swift 5 , um Dictionary nach KEYS zu sortieren

let sortedYourArray = YOURDICTIONARY.sorted( by: { $0.0 < $1.0 })

Um das Wörterbuch nach WERTEN zu sortieren

let sortedYourArray = YOURDICTIONARY.sorted( by: { $0.1 < $1.1 })
Abdul Karim Khan
quelle
4

Bei Swift 3 gibt die folgende Sortierung das sortierte Wörterbuch nach Schlüsseln zurück:

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"]
Arijan
quelle
10
Dies wird kein Wörterbuch zurückgeben, dies wird eine Reihe von
Tupeln zurückgeben
Lesen Sie die Frage nicht einmal, bevor Sie Ihre Antwort geben. Sie verschwenden hier Zeit mit vielen Menschen. Bei dieser Frage geht es speziell darum, ein Wörterbuch zu sortieren und ein sortiertes Wörterbuch ohne Array zu erhalten. Ich weiß nicht, warum alle falsche Antworten geben.
Shivam Pokhriyal
3

"sortiert" in iOS 9 & xcode 7.3, Swift 2.2 ist unmöglich, ändern Sie "sortiert" in "sortieren" wie folgt:

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]
AmyNguyen
quelle
3
Das Ergebnis von sortedKeysAndValues ​​ist kein Wörterbuch, sondern ein Array!
Kanal
2
Das Ergebnis ist ein Arrayvon Tuples, keinDictionary
2

Swift 5

Geben Sie Ihr Wörterbuch ein, das Sie alphabetisch nach Schlüsseln sortieren möchten.

// Sort inputted dictionary with keys alphabetically.
func sortWithKeys(_ dict: [String: Any]) -> [String: Any] {
    let sorted = dict.sorted(by: { $0.key < $1.key })
    var newDict: [String: Any] = [:]
    for sortedDict in sorted {
        newDict[sortedDict.key] = sortedDict.value
    }
    return newDict
}

dict.sorted (by: {$ 0.key <$ 1.key}) gibt selbst ein Tupel (Wert, Wert) anstelle eines Wörterbuchs [Wert: Wert] zurück. Daher analysiert die for-Schleife das Tupel, um es als Wörterbuch zurückzugeben. Auf diese Weise fügen Sie ein Wörterbuch ein und erhalten ein Wörterbuch zurück.

Krekin
quelle
2

Schnelle 4 & 5

Zum Sortieren von Zeichenfolgenschlüsseln:

dictionary.keys.sorted(by: {$0.localizedStandardCompare($1) == .orderedAscending})

Beispiel:

var dict : [String : Any] = ["10" : Any, "2" : Any, "20" : Any, "1" : Any]

dictionary.keys.sorted() 

["1" : Any, "10" : Any, "2" : Any, "20" : Any]

dictionary.keys.sorted(by: {$0.localizedStandardCompare($1) == .orderedAscending})

["1" : Any, "2" : Any, "10" : Any, "20" : Any]

Xav Mac
quelle
1

Für Swift 3 hat Folgendes bei mir funktioniert und die Swift 2-Syntax hat nicht funktioniert:

// 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
Joeri
quelle
Diese Antwort ist ziemlich unvollständig. Was ist sortedDict? Was ist menu? Dieser Code scheint ebenfalls nicht gültig zu sein.
random_user_name
Etwas Ernstes jetzt: Ein Wörterbuch hat keine Reihenfolge . Was Sie mit Ihrem Code erhalten, ist eine Reihe von Tupeln, kein sortiertes Wörterbuch - wie bereits in einigen Antworten und Kommentaren erwähnt.
Eric Aya
Das Thema ist: Wörterbuch nach Schlüsseln sortieren, ich beantworte dieses Thema. Und es ist eine spezielle Bemerkung, die nur eine Syntaxänderung in Swift 3 betrifft. Sie leugnet nichts von dem, was zuvor geschrieben wurde.
Joeri
"Diese Antwort ist ziemlich unvollständig. Was ist sortiertDikt? Was ist ein Menü? Dieser Code scheint auch nicht gültig zu sein. - cale_b" Die Antwort wurde bearbeitet, es fehlte nur noch eine Deklaration für ein Wörterbuch - Menü. Ich dachte es wäre klar, es geht nur um eine Syntaxänderung in Swift 3 wie angegeben. Der Code funktioniert in Swift 3.
Joeri
irgendeinen Vorschlag für schnelle 4 plz?
Famfamfam
1

Swift 3 ist sortiert (nach: <)

let dictionary = [
    "A" : [1, 2],
    "Z" : [3, 4],
    "D" : [5, 6]
]

let sortedKeys = Array(dictionary.keys).sorted(by:<) // ["A", "D", "Z"]
Shadros
quelle