Сортувати словник за клавішами


128

Я хочу сортувати словник у Swift. У мене є словник типу:

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

і т. д. Я хочу, щоб це було так

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

тощо.

Я спробував багато рішень щодо SO, але ніхто не працював на мене. Я використовую XCode6 Beta 5, і на ньому деякі дають помилку компілятора, а деякі рішення дають винятки. Тому кожен, хто може опублікувати робочу копію сортування словників.



6
Ви не можете сортувати словник, це асоціативний контейнер. Якщо вам потрібно певне замовлення, скопіюйте ключі в масив і відсортуйте їх. Потім перейдіть по клавішах і перетягніть їх відповідні значення.
dasblinkenlight

@dasblinkenlight Тож чи можете ви сказати мені, як швидко сортувати масив?
Алеем Ахмад

@AleemAhmad Поглянь на цю відповідь , вона має sortedKeysфункцію.
dasblinkenlight

@dasblinkenlight Я спробував це, але це дає помилку на [KeyType]
Aleem Ahmad

Відповіді:


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

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

Редагувати:

Відсортований масив з вищевказаного коду містить лише ключі, тоді як значення повинні бути отримані з оригінального словника. Однак 'Dictionary'також є 'CollectionType'(ключ, значення) пар, і ми можемо використовувати глобальну 'sorted'функцію, щоб отримати відсортований масив, що стосується і ключів, і значень, наприклад:

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

EDIT2: Наразі перевагу щомісячного синтаксису Swift

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

Глобальний sortedзастарілий.


Це дає вам масив ключів. У масиві відсутні значення. Ви можете знайти значення зі словника, я думаю.
StilesCrisis

2
Ти правий. Я щойно відредагував пост, щоб запропонувати рішення для отримання масиву пар (ключ, значення), відсортованого за ключами. Дякуємо за коментар
Івіга М.

@IvicaM. Привіт! Я зрозумів, як я можу сортувати словник за клавішами, але не розумію, як можна сортувати масив елементів у словнику. Будь ласка, допоможи мені. Наприклад приватні контакти var: [(Рядок, [Користувач])] = []
Олександр Хітев

5
Swift 3 = Array (dictionary.keys). Додано (від: <)
miff

4
Станом на Swift 4, ви можете написатиlet sortedKeys = dictionary.keys.sorted()
Code Different

113

Швидкий 2.0

Оновлена ​​версія відповіді Івіці М:

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

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

Швидкий 3

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

Зверніть увагу:

Не дивуйтеся, що отриманий тип - це масив, а не словник. Словники не можна сортувати ! Отриманий тип даних - це відсортований масив, подібно до відповіді @ Ivica.


26
це фактично повертає масив [(String, [Int])], а не словник
scord

4
Зрозуміли, що словники є несортованими, тому не має сенсу відтворювати тип даних у будь-якому випадку. Я закінчив просто зберегти масив відсортованих ключів.
сард

Я отримую Binary operator > can not be compared to two будь-які операнди. Дауншинг також не працює
Шон

27

Якщо ви хочете переглядати і клавіші, і значення в упорядкованому порядку за ключами, ця форма є досить короткою

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

відсортовано - власний метод або що? він показує помилку під час реалізації
rikky

@rikkyG Свіфт 1: sortі sorted. Швидкий 2: sortстав sortInPlaceі sortedстав sort.
Ерік Айя

14

У швидкому 4 ви можете написати це розумніше:

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

3
Дякую за докладені зусилля, але, перш за все, "нехай" не зводить код, тому спочатку він повинен бути "var". Потім після успішного компіляції цей код не працює, він не сортує словник, я отримую однаковий результат до та після запуску цього коду. Можливо, мені щось не вистачає, але, будь ласка, детальніше розробимо або змініть код. ======= var d = [1: "привіт", 2: "до побачення", -1: "foo"] print (d) - >>> друкує [2: "bye", -1: " foo ", 1:" привіт "] d = [Int: String] (uniqueKeysWithValues: d.sorted {$ 0.key <$ 1.key}) print (d) - >>> друкує [2:" до побачення ", -1 : "foo", 1: "привіт"]
КаримІхаб

Це не можливо, коли ви перетворити його назад в словник вона буде змінюватися в невпорядкованою колекції , як словники в стрижа невпорядковані колекції developer.apple.com/documentation/swift/dictionary
Jaimin

12

Я спробував усе вищесказане, у двох словах - все, що вам потрібно

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 для мене працювало наступне:

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
Це не повертає Словник, це поверне масив кортежів
Даніель Арантес Ловерде

Словники @DanielArantesLoverde за визначенням нестандартні. Масив кортежів - найкраще, що можна зробити.
Джон Монтгомері

1
Я це знаю, але питання задайте замовлене, тому ця відповідь є невірною. Ви згодні?
Даніель Арантес Ловерде

6

Це елегантна альтернатива сортування самого словника:

Станом на Swift 4 & 5

let sortedKeys = myDict.keys.sorted()

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

6

У Swift 5 , щоб сортувати Словник за KEYS

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

Для того, щоб сортувати Словник за VALUES

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

4

Для Swift 3 такі сортування повертає словник за клавішами:

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
Це не поверне словник, це поверне масив
Tuples

Ви навіть не прочитали питання, перш ніж поставити свою відповідь. Ви витрачаєте тут багато людей. Це питання стосується сортування словника та отримання відсортованого словника не масиву. Я не знаю, чому всі ставлять неправильні відповіді.
Шивам Похріял

3

"відсортовано" в iOS 9 та xcode 7.3, swift 2.2 неможливо, змінити "відсортовано" на "сортування", як це:

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
Результат sortedKeysAndValues ​​- це не словник, це масив!
Канал

2
Результатом є Arrayз Tuples, а НЕDictionary

2

Швидкий 5

Введіть свій словник, який потрібно сортувати за алфавітом за клавішами.

// 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 (від: {$ 0.key <$ 1.key}) самостійно повертає кортеж (значення, значення) замість словника [value: value]. Таким чином, цикл for аналізує кортеж, щоб повернутися як словник. Таким чином, ви складаєте словник і отримуєте словник назад.


2

Швидкий 4 і 5

Для сортування рядкових клавіш:

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

Приклад:

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 для мене працювало наступне, а синтаксис Swift 2 не працював:

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

Ця відповідь досить неповна. Що таке sortedDict? Що таке menu? Цей код також не є дійсним.
random_user_name

Зараз щось серйозніше: словник не має порядку . Що ви отримуєте зі своїм кодом - це масив кортежів, а не відсортований словник - як уже сказано в деяких відповідях та коментарях.
Ерік Айя

тема полягає в: сортування словника за клавішами, я відповідаю на цю тему. І це специфічне зауваження, що стосується лише зміни синтаксису в Swift 3, воно не заперечує нічого з написаного раніше.
Joeri

"Ця відповідь досить неповна. Що таке сортуванняДиктат? Що таке меню? Не видається, що і цей код є неправдивим. - cale_b" Відповідь було відредаговано, єдине, чого не було, - це декларація про диктування - меню. Я думав, що це зрозуміло, мова йде лише про зміну синтаксису Swift 3, як зазначено. Код працює в Swift 3.
Joeri

будь-яка пропозиція для швидких 4 PLZ?
famfamfam

1

Swift 3 сортується (за: <)

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

let sortedKeys = Array(dictionary.keys).sorted(by:<) // ["A", "D", "Z"]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.