Ordina dizionario per chiavi


128

Voglio ordinare un dizionario in Swift. Ho un dizionario come:

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

ecc. Voglio che sia così

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

eccetera.

Ho provato molte soluzioni su SO ma nessuno ha funzionato per me. Sto usando XCode6 Beta 5 e su questo alcuni stanno dando errori di compilatore e alcune soluzioni stanno dando eccezioni. Quindi chiunque può pubblicare la copia di lavoro dell'ordinamento del dizionario.



6
Non puoi ordinare un dizionario, è un contenitore associativo. Se è necessario un ordine particolare, copiare le chiavi in ​​un array e ordinarle. Quindi scorrere le chiavi e estrarre i valori corrispondenti.
dasblinkenlight,

@dasblinkenlight Quindi puoi dirmi come ordinare rapidamente un array?
Aleem Ahmad,

@AleemAhmad Dai un'occhiata a questa risposta , ha una sortedKeysfunzione.
dasblinkenlight,

@dasblinkenlight Ho provato questo ma sta dando errore su [KeyType]
Aleem Ahmad

Risposte:


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

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

MODIFICARE:

L'array ordinato dal codice sopra contiene solo chiavi, mentre i valori devono essere recuperati dal dizionario originale. Tuttavia, 'Dictionary'è anche una 'CollectionType'coppia di (chiave, valore) e possiamo usare la 'sorted'funzione globale per ottenere un array ordinato che contenga sia chiavi che valori, come questo:

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

EDIT2: la sintassi Swift che cambia mensilmente attualmente preferisce

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

Il globale sortedè deprecato.


Questo ti dà una serie di chiavi. Nell'array mancano i valori. Potresti cercare i valori dal dizionario, immagino.
StilesCrisis,

2
Hai ragione. Ho appena modificato il post per fornire una soluzione per ottenere una matrice di coppie (chiave, valore) ordinate per chiavi. Grazie per il commento.
Ivica M.

@IvicaM. Ciao! Ho capito come posso ordinare il dizionario in base alle chiavi, ma non capisco come posso ordinare una matrice di elementi nel dizionario. Mi aiuti per favore. Ad esempio contatti var privati: [(String, [User])] = []
Alexander Khitev

5
Swift 3 = Array (dictionary.keys) .sorted (di: <)
miff

4
A partire da Swift 4, puoi scriverelet sortedKeys = dictionary.keys.sorted()
Codice diverso il

113

Swift 2.0

Versione aggiornata della risposta di 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 })

Avviso:

Non sorprenderti se il tipo risultante è un array anziché un dizionario. I dizionari non possono essere ordinati ! Il tipo di dati risultante è un array ordinato, proprio come nella risposta di @ Ivica.


26
questo in realtà restituisce un array di [(String, [Int])] non un Dizionario
scord

4
i dizionari realizzati non sono ordinati, quindi non ha molto senso ricreare il tipo di dati comunque. Ho finito per salvare un array di chiavi ordinate.
Scord

Ottengo Binary operator > can not be compared to two qualsiasi operando. Anche il downcast non funziona
Sean il

27

Se si desidera scorrere le chiavi e i valori in un ordine ordinato per chiave, questo modulo è piuttosto sintetico

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

ordinato è il metodo personalizzato o cosa? mostra errori durante l'implementazione
rikky

@rikkyG Swift 1: sorte sorted. Swift 2: sortè diventato sortInPlaceed sortedè diventato sort.
Eric Aya,

14

In swift 4 puoi scriverlo in modo più intelligente:

let d = [ 1 : "hello", 2 : "bye", -1 : "foo" ]
d = [Int : String](uniqueKeysWithValues: d.sorted{ $0.key < $1.key })

3
Grazie per lo sforzo, ma prima di tutto, il "let" non crea il codice, quindi prima deve essere "var". Quindi dopo la compilazione riuscita questo codice non funziona, non ordina il dizionario ottengo lo stesso risultato prima e dopo aver eseguito questo codice. Forse mi manca qualcosa, ma per favore elaborane di più o modifica il codice. ======= var d = [1: "ciao", 2: "ciao", -1: "pippo"] stampa (d) - >>> stampa [2: "ciao", -1: " pippo ", 1:" ciao "] d = [Int: String] (uniqueKeysWithValues: d.sorted {$ 0.key <$ 1.key}) print (d) - >>> stampa [2:" bye ", -1 : "foo", 1: "hello"]
KarimIhab il

Non è possibile poiché quando lo converti di nuovo in dizionario cambierà in raccolta non ordinata poiché i dizionari in rapido sono raccolta non ordinata developer.apple.com/documentation/swift/dictionary
Jaimin

12

Ho provato tutto quanto sopra, in poche parole tutto ciò che serve è

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


6

Per Swift 4 ha funzionato per me:

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
Questo non restituisce un dizionario, questo restituirà una serie di tuple
Daniel Arantes Loverde,

I dizionari @DanielArantesLoverde sono insostenibili per definizione. Una serie di tuple è il meglio che puoi fare.
John Montgomery,

1
Lo so, ma la domanda richiede un ordine, quindi questa risposta non è corretta. Sei d'accordo?
Daniel Arantes Loverde,

6

Questa è un'alternativa elegante all'ordinamento del dizionario stesso:

A partire da Swift 4 e 5

let sortedKeys = myDict.keys.sorted()

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

6

In Swift 5 , per ordinare Dizionario per CHIAVI

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

Per ordinare Dizionario per VALORI

let sortedYourArray = YOURDICTIONARY.sorted( by: { $0.1 < $1.1 })

4

Per Swift 3, il seguente ordinamento restituisce il dizionario ordinato in base alle chiavi:

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
Questo non restituirà un dizionario, questo restituirà una matrice di Tuple
anoop4real

Non leggere nemmeno la domanda prima di inserire la risposta. Stai sprecando il tempo di molte persone qui. Questa domanda riguarda in particolare l'ordinamento di un dizionario e l'ottenimento di un dizionario ordinato non di matrice. Non so perché tutti stiano dando risposte sbagliate.
Shivam Pokhriyal,

3

"ordinato" in iOS 9 e xcode 7.3, swift 2.2 è impossibile, cambia "ordinato" in "ordina", in questo modo:

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
Il risultato di SortKeysAndValues ​​non è un dizionario, è una matrice!
Canale

2
Il risultato è un Arrayof Tuples, non unDictionary

2

Swift 5

Inserisci il dizionario che desideri ordinare in ordine alfabetico in base ai tasti.

// 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}) da solo restituisce una tupla (valore, valore) invece di un dizionario [valore: valore]. Pertanto, il ciclo for analizza la tupla per tornare come dizionario. In questo modo, si inserisce un dizionario e si recupera un dizionario.


2

Swift 4 e 5

Per l'ordinamento delle chiavi stringa:

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

Esempio:

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

Per Swift 3 per me ha funzionato e la sintassi di Swift 2 non ha funzionato:

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

Questa risposta è piuttosto incompleta. Che cosa è sortedDict? Che cosa è menu? Anche questo codice non sembra essere valido.
random_user_name

Qualcosa di più serio ora: un dizionario non ha alcun ordine . Quello che ottieni con il tuo codice è una matrice di tuple, non un dizionario ordinato - come già detto in alcune risposte e commenti.
Eric Aya,

l'argomento è: ordina il dizionario per chiavi, sto rispondendo a questo argomento. Ed è un'osservazione specifica riguardante solo una modifica della sintassi in Swift 3, non nega nulla di quanto è stato scritto in precedenza.
Joeri,

"Questa risposta è piuttosto incompleta. Che cos'è sortDict? Che cos'è il menu? Neanche questo codice sembra essere valido. - cale_b" La risposta è stata modificata, l'unica cosa che mancava era una dichiarazione per un menu di dizione. Ho pensato che fosse chiaro, si tratta solo di una modifica della sintassi in Swift 3 come indicato. Il codice funziona in Swift 3.
Joeri

qualche suggerimento per swift 4 plz?
famfamfam,

1

Swift 3 è ordinato (per: <)

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

let sortedKeys = Array(dictionary.keys).sorted(by:<) // ["A", "D", "Z"]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.