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


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.