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.



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.


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.


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

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

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


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
}

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

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

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

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]

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.


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]


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

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"]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.