Sözlüğü tuşlara göre sırala


128

Swift'de bir sözlüğü sıralamak istiyorum. Şöyle bir sözlüğüm var:

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

vb gibi olmasını istiyorum

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

vb.

SO'da birçok çözüm denedim ama kimse benim için çalışmadı. XCode6 Beta 5 kullanıyorum ve üzerinde bazıları derleyici hatası veriyor ve bazı çözümler istisnalar veriyor. Yani sözlük sıralamanın çalışan kopyasını gönderebilen herkes.



6
Bir sözlüğü sıralayamazsınız, bu ilişkisel bir kapsayıcıdır. Belirli bir sıraya ihtiyacınız varsa, anahtarları bir diziye kopyalayın ve sıralayın. Sonra anahtarlar üzerinde yineleyin ve karşılık gelen değerleri çekin.
dasblinkenlight

@dasblinkenlight Bir diziyi hızlı bir şekilde nasıl sıralayacağımı söyleyebilir misin?
Aleem Ahmad

@AleemAhmad Bu cevaba bir bakın , sortedKeysişlevi var.
dasblinkenlight

@dasblinkenlight Bunu denedim ama [KeyType] 'da hata veriyor
Aleem Ahmad

Yanıtlar:


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

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

DÜZENLE:

Yukarıdaki koddan sıralanan dizi yalnızca anahtarları içerirken, değerlerin orijinal sözlükten alınması gerekir. Bununla birlikte, 'Dictionary'aynı zamanda bir 'CollectionType'(anahtar, değer) çiftidir ve 'sorted'hem anahtarları hem de değerleri içeren sıralı bir dizi elde etmek için global işlevi kullanabiliriz , örneğin:

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

DÜZENLEME2: Aylık değişen Swift sözdizimi şu anda tercih ediyor

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

Global sortedkullanımdan kaldırıldı.


Bu size bir dizi anahtar verir. Dizi değerlerden yoksundur. Değerlere sözlükten bakabilirsin sanırım.
StilesCrisis

2
Haklısın. Anahtarlara göre sıralanmış bir dizi (anahtar, değer) çifti elde etmek için bir çözüm sağlamak üzere yazıyı yeni düzenledim. Yorum için teşekkürler.
Ivica M.

@IvicaM. Merhaba! Sözlüğü anahtarlara göre nasıl sıralayabileceğimi anladım, ancak sözlükteki öğeleri nasıl sıralayabilirim anlamıyorum. Lütfen bana yardım et. Örneğin özel değişken kişiler: [(Dize, [Kullanıcı])] = []
Alexander Khitev

5
Swift 3 = Dizi (sözlük.keys). Sıralı (göre: <)
miff

4
Swift 4 itibariyle yazabilirsinizlet sortedKeys = dictionary.keys.sorted()
Kod Farklı

113

Swift 2.0

Ivica M'nin cevabının güncellenmiş versiyonu:

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

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

Hızlı 3

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

Farkına varmak:

Ortaya çıkan türün sözlükten çok bir dizi olmasına şaşırmayın. Sözlükler sıralanamaz ! Ortaya çıkan veri türü, @ Ivica'nın cevabında olduğu gibi sıralı bir dizidir.


26
bu aslında bir Sözlük değil [(String, [Int])] dizisini döndürür
scord

4
Gerçekleşen Sözlükler sıralanmamıştır, bu nedenle yine de veri türünü yeniden oluşturmak pek bir anlam ifade etmez. Sonunda sıralı anahtarlardan oluşan bir diziyi kaydetmeye başladım.
scord

Ben olsun Binary operator > can not be compared to two Any` işlenen. Downcasting de işe yaramıyor
Sean

27

Anahtar sıralı bir sırada hem anahtarlar hem de değerler üzerinde yineleme yapmak istiyorsanız, bu form oldukça kısa ve özdür

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

sıralanır Özel yöntem mi yoksa Ne? uygulama sırasında hata gösteriyor
rikky

@rikkyG Swift 1: sortve sorted. Swift 2: sortoldu sortInPlaceve sortedoldu sort.
Eric Aya

14

Swift 4'te daha akıllı yazabilirsiniz:

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

3
Çaba için teşekkürler ama her şeyden önce, "izin ver" kodun oluşturulmasını sağlamaz, bu yüzden önce "var" olması gerekir. Sonra derleme başarılı olduktan sonra bu kod çalışmıyor sözlüğü sıralamıyor, bu kodu çalıştırmadan önce ve sonra aynı sonucu elde ediyorum. Belki bir şeyi kaçırıyorum ama lütfen daha fazla ayrıntı verin veya kodu değiştirin. ======= var d = [1: "merhaba", 2: "güle güle", -1: "foo"] baskı (d) - >>> yazdırır [2: "güle güle", -1: " foo ", 1:" merhaba "] d = [Int: String] (uniqueKeysWithValues: d.sorted {$ 0.key <$ 1.key}) print (d) - >>> baskılar [2:" bye ", -1 : "foo", 1: "merhaba"]
KarimIhab

Sözlüğe geri dönüştürdüğünüzde sırasız koleksiyona geçeceği için mümkün değildir, çünkü
hızlıdaki

12

Yukarıdakilerin hepsini denedim, kısaca tek ihtiyacınız olan

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


6

Swift 4 için aşağıdakiler benim için çalıştı:

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
Bu bir Sözlük döndürmez, bu bir dizi demeti döndürecektir
Daniel Arantes Loverde

@DanielArantesLoverde Sözlükler tanım gereği sıralanamaz. Yapabileceğiniz en iyi şey bir dizi dizidir.
John Montgomery

1
Bunu biliyorum ama soru bir sıralı soruyor, bu yüzden bu cevap doğru değil. Katılıyor musun?
Daniel Arantes Loverde

6

Bu, sözlüğün kendisini sıralamak için zarif bir alternatiftir:

Swift 4 ve 5'ten itibaren

let sortedKeys = myDict.keys.sorted()

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

6

In Swift 5 , sırayla Sözlük ANAHTAR göre sıralamak

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

Sözlüğü VALUES'a göre sıralamak için

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

4

Swift 3 için, aşağıdaki sıralama, sözlüğü tuşlara göre sıralanmış olarak döndürür:

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
Bu bir sözlük döndürmeyecek, bu bir
Tuple

Cevabını yazmadan önce soruyu okumaz mısın? Burada birçok insanın zamanını boşa harcıyorsun. Bu soru özellikle bir sözlüğü sıralamak ve dizi yerine sıralı bir sözlüğü elde etmekle ilgilidir. Neden herkesin yanlış cevaplar verdiğini bilmiyorum.
Shivam Pokhriyal

3

iOS 9 ve xcode 7.3'te "sıralı", hızlı 2.2 imkansızdır, "sıralı" yı "sırala" olarak değiştirin, aşağıdaki gibi:

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
SıralanmışKeysAndValues'in sonucu bir sözlük değil, bir Dizidir!
Kanal

2
Sonuç bir olduğu Arraybir Tuplesdeğil, birDictionary

2

Swift 5

Alfabetik olarak sıralamak istediğiniz sözlüğünüzü tuşlarla girin.

// 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}) kendi başına bir sözlük [değer: değer] yerine bir demet (değer, değer) döndürür . Böylece, for döngüsü tuple'ı bir sözlük olarak döndürmek için ayrıştırır. Bu şekilde, bir sözlüğe koyarsınız ve bir sözlük geri alırsınız.


2

Swift 4 ve 5

Dize anahtarlarının sıralanması için:

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

Misal:

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

Swift 3 için aşağıdakiler benim için çalıştı ve Swift 2 sözdizimi çalışmadı:

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

Bu cevap oldukça eksik. Nedir sortedDict? Nedir menu? Bu kod da geçerli görünmüyor.
random_user_name

Şimdi daha ciddi bir şey: sözlüğün düzeni yoktur . Kodunuzla elde ettiğiniz şey, bazı yanıtlarda ve yorumlarda daha önce söylendiği gibi sıralı bir sözlük değil, bir dizidir.
Eric Aya

konu şudur: sözlüğü tuşlara göre sırala, bu konuya cevap veriyorum. Ve sadece Swift 3'teki sözdizimi değişikliğiyle ilgili belirli bir yorum, daha önce yazılanlardan hiçbir şeyi inkar etmiyor.
Joeri

"Bu cevap oldukça eksik. SıralıDict nedir? Menü nedir? Bu kod da geçerli görünmüyor. - cale_b" Cevap düzenlendi, eksik olan tek şey bir diksiyon - menü beyanıydı. Açık olduğunu düşündüm, bu sadece belirtildiği gibi Swift 3'te bir sözdizimi değişikliği ile ilgili. Kod Swift 3'te çalışıyor.
Joeri

swift 4 plz için herhangi bir öneri?
famfamfam

1

Swift 3 sıralanır (göre: <)

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

let sortedKeys = Array(dictionary.keys).sorted(by:<) // ["A", "D", "Z"]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.