Urutkan Kamus dengan tombol

128

Saya ingin mengurutkan kamus di Swift. Saya punya kamus seperti:

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

dll. Saya ingin menjadi seperti

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

dll.

Saya telah mencoba banyak solusi pada SO tetapi tidak ada yang bekerja untuk saya. Saya menggunakan XCode6 Beta 5 dan di atasnya ada yang memberikan kesalahan kompiler dan beberapa solusi memberikan pengecualian. Jadi siapa saja yang dapat memposting copy pekerjaan kamus.

Aleem Ahmad
sumber
6
Anda tidak dapat mengurutkan kamus, ini adalah wadah asosiatif. Jika Anda memerlukan pesanan tertentu, salin kunci ke dalam array, dan urutkan. Kemudian beralih di atas tombol, dan tarik nilainya sesuai.
dasblinkenlight
@dasblinkenlight Jadi bisakah Anda memberi tahu saya cara mengurutkan array dengan cepat?
Aleem Ahmad
@ AleemAhmad Lihatlah jawaban ini , ia memiliki sortedKeysfungsi.
dasblinkenlight
@dasblinkenlight Saya sudah mencoba ini tetapi memberikan kesalahan pada [KeyType]
Aleem Ahmad

Jawaban:

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

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

EDIT:

Array yang diurutkan dari kode di atas hanya berisi kunci, sedangkan nilai harus diambil dari kamus asli. Namun, 'Dictionary'juga merupakan 'CollectionType'pasangan (kunci, nilai) dan kita dapat menggunakan 'sorted'fungsi global untuk mendapatkan array yang diurutkan yang terdiri dari kunci dan nilai, seperti ini:

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

EDIT2: Sintaks Swift perubahan bulanan saat ini lebih disukai

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

Global sortedsudah usang.

Ivica M.
sumber
Ini memberi Anda array kunci. Array tidak memiliki nilai. Anda bisa mencari nilai dari kamus, saya kira.
StilesCrisis
2
Kamu benar. Saya baru saja mengedit posting untuk memberikan solusi untuk mendapatkan array pasangan (kunci, nilai) yang diurutkan berdasarkan kunci. Terima kasih atas komentarnya.
Ivica M.
@IvicaM. Halo! Saya mengerti bagaimana saya bisa mengurutkan kamus dengan kunci, tetapi saya tidak mengerti bagaimana saya bisa mengurutkan berbagai elemen dalam kamus. Tolong bantu aku. Misalnya kontak pribadi var: [(String, [Pengguna])] = []
Alexander Khitev
5
Swift 3 = Array (dictionary.keys) .sorted (oleh: <)
miff
4
Pada Swift 4, Anda dapat menulislet sortedKeys = dictionary.keys.sorted()
Kode Berbeda
113

Swift 2.0

Versi terbaru dari jawaban Ivica M:

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

let sortedDict = wordDict.sort { $0.0 < $1.0 }
print("\(sortedDict)") // 

Cepat 3

wordDict.sorted(by: { $0.0 < $1.0 })

Memperhatikan:

Jangan kaget bahwa tipe yang dihasilkan adalah array daripada kamus. Kamus tidak dapat disortir ! Jenis data yang dihasilkan adalah array yang diurutkan, seperti dalam jawaban @ Ivica.

Dan Beaulieu
sumber
26
ini sebenarnya mengembalikan array [(String, [Int])] bukan Kamus
scord
4
Kamus yang direalisasi tidak diurutkan, jadi tidak masuk akal untuk membuat ulang tipe data. Saya akhirnya hanya menyimpan array kunci yang diurutkan.
scord
Saya mendapatkan Binary operator > can not be compared to two operan Any`. Downcasting juga tidak berfungsi
Sean
27

Jika Anda ingin mengulangi kedua kunci dan nilai dalam urutan kunci, formulir ini cukup ringkas

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
sumber
diurutkan adalah metode Kustom atau Apa? itu menunjukkan kesalahan saat menerapkan
rikky
@rikkyG Swift 1: sortdan sorted. Swift 2: sorttelah menjadi sortInPlacedan sortedtelah menjadi sort.
Eric Aya
14

Di swift 4 Anda dapat menulisnya lebih pintar:

let d = [ 1 : "hello", 2 : "bye", -1 : "foo" ]
d = [Int : String](uniqueKeysWithValues: d.sorted{ $0.key < $1.key })
Davide Gianessi
sumber
3
Terima kasih atas upaya tetapi pertama-tama, "biarkan" tidak membuat kode, jadi pertama-tama harus "var". Kemudian setelah kompilasi berhasil kode ini tidak berfungsi, tidak mengurutkan kamus saya mendapatkan hasil yang sama sebelum dan setelah menjalankan kode ini. Mungkin saya kehilangan sesuatu tetapi tolong uraikan lebih lanjut atau ubah kodenya. ======= var d = [1: "hello", 2: "bye", -1: "foo"] print (d) - >>> cetakan [2: "bye", -1: " foo ", 1:" hello "] d = [Int: String] (uniqueKeysWithValues: d.sorted {$ 0.key <$ 1.key}) print (d) - >>> mencetak [2:" bye ", -1 : "foo", 1: "hello"]
KarimIhab
Ini tidak mungkin karena ketika Anda mengonversikannya kembali ke kamus, kamus itu akan berubah menjadi koleksi yang tidak berurutan karena kamus-kamus dalam bahasa swift adalah pengembang
Jaimin
12

Saya mencoba semua hal di atas, singkatnya yang Anda butuhkan adalah

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

Elsammak
sumber
6

Untuk Swift 4, berikut ini berhasil bagi saya:

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
sumber
5
Ini tidak mengembalikan Kamus, ini akan mengembalikan array tupel
Daniel Arantes Loverde
Kamus @DanielArantesLoverde tidak dapat diubah menurut definisi. Sederetan tuple adalah yang terbaik yang bisa Anda lakukan.
John Montgomery
1
Saya tahu itu, tetapi pertanyaannya meminta diperintahkan, jadi jawaban ini tidak benar. Apa kamu setuju?
Daniel Arantes Loverde
6

Ini adalah alternatif elegan untuk menyortir kamus itu sendiri:

Mulai dari Swift 4 & 5

let sortedKeys = myDict.keys.sorted()

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

Di Swift 5 , untuk mengurutkan Kamus berdasarkan KEYS

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

Untuk mengurutkan Kamus berdasarkan VALUES

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

Untuk Swift 3, pengurutan berikut mengembalikan kamus yang diurutkan dengan kunci:

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
sumber
10
Ini tidak akan mengembalikan kamus, ini akan mengembalikan array
Tuples
Anda bahkan tidak membaca pertanyaan sebelum memberikan jawaban Anda. Anda menghabiskan banyak waktu di sini. Pertanyaan ini secara khusus tentang mengurutkan kamus dan mendapatkan kamus yang diurutkan bukan array. Saya tidak tahu mengapa semua orang memberikan jawaban yang salah.
Shivam Pokhriyal
3

"diurutkan" di iOS 9 & xcode 7.3, swift 2.2 tidak mungkin, ubah "sortir" menjadi "sortir", seperti ini:

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
sumber
3
Hasil dari sortKeysAndValues ​​bukan kamus, ini adalah Array!
Saluran
2
Hasilnya adalah Arraydari Tuples, tidakDictionary
2

Cepat 5

Masukkan kamus Anda yang ingin Anda urutkan berdasarkan abjad dengan tombol.

// 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 (oleh: {$ 0.key <$ 1.key}) dengan sendirinya mengembalikan tuple (nilai, nilai) alih-alih kamus [nilai: nilai]. Jadi, for for mem-parsing tuple untuk kembali sebagai kamus. Dengan begitu, Anda memasukkan kamus & mendapatkan kamus kembali.

Krekin
sumber
2

Swift 4 & 5

Untuk pengurutan kunci string:

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

Contoh:

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

Untuk Swift 3 berikut ini berfungsi untuk saya dan sintaks Swift 2 belum berfungsi:

// 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
sumber
Jawaban ini sangat tidak lengkap. Apa sortedDict? Apa menu? Kode ini juga tampaknya tidak valid.
random_user_name
Sesuatu yang lebih serius sekarang: kamus tidak memiliki urutan . Apa yang Anda dapatkan dengan kode Anda adalah serangkaian tupel, bukan kamus yang diurutkan - seperti yang sudah dikatakan dalam beberapa jawaban dan komentar.
Eric Aya
topiknya adalah: urutkan kamus dengan kunci, saya menjawab topik ini. Dan itu adalah komentar khusus tentang hanya perubahan sintaks pada Swift 3, itu tidak menyangkal apa pun dari apa yang telah ditulis sebelumnya.
Joeri
"Jawaban ini sangat tidak lengkap. Apa itu sortDict? Apa menu? Kode ini juga tampaknya tidak valid. - cale_b" Jawabannya diedit, satu-satunya hal yang hilang adalah deklarasi untuk dictionaty - menu. Saya pikir sudah jelas, ini hanya tentang perubahan sintaks pada Swift 3 seperti yang ditunjukkan. Kode tidak berfungsi di Swift 3.
Joeri
ada saran untuk swift 4 plz?
famfamfam
1

Swift 3 diurutkan (berdasarkan: <)

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

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