Сортировать словарь по ключу (дате) - PullRequest
0 голосов
/ 26 февраля 2020

Я создаю список заметок, которые мне нужно сгруппировать по дате, и их отображение отсортировано по этой дате. Для поддержки структуры данных у меня есть словарь, подобный этому:

var sortedDictionary: [Date: [String]] = [:]

Я пытался использовать sortedDictionary.sorted { $0.0 < $1.0 }, но это возвращает кортеж, а не словарь.

Если бы кто-нибудь мог предоставить некоторую помощь о том, как я могу либо преобразовать этот кортеж обратно в словарь, либо просто отсортировать словарь, используя ключи, являющиеся датами, это было бы очень полезно.

Ответы [ 3 ]

1 голос
/ 26 февраля 2020

Словари не упорядочены по определению.

Вы можете map преобразовать словарь в (массив) структуры, которая может быть отсортирована

struct Section {
    let date : Date
    let notes : [String]
}

let sections = groupedDictionary.map{Section(date: $0.key, notes: $0.value}.sorted{$0.date < $1.date}
1 голос
/ 26 февраля 2020

Да, словари не упорядочены по определению, но вы можете создать отсортированный массив ключей словаря

let dict: [Date: [String]] = [:]
let sortedKeys = dict.keys.sorted { $0 < $1 }

, а затем, например, использовать эти отсортированные ключи в источнике данных tableView как раздел

extension NotesViewController: UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
        return sortedKeys.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dict[sortedKeys[section]]?.count ?? 0
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let value = dict[sortedKeys[indexPath.section]]?[indexPath.row] 
            else { return UITableViewCell() }

        return UITableViewCell()
    }

Надеюсь, этот пример поможет вам

0 голосов
/ 26 февраля 2020
let whatYouGet: [Dictionary<Date, [String]>.Element] = unsortedDictionary
                                                         .sorted { $0.0 < $1.0 }
whatYouGet.forEach { print("\($0.key): \($0.value)") } // you search this

Кстати: порядок словаря ненадежен

Из документации по словарю Swift:

Порядок пар ключ-значение в словаре стабилен между мутациями, но в противном случае непредсказуемы. Если вам нужен упорядоченный набор пар ключ-значение и вам не нужен быстрый поиск ключей, который обеспечивает Dictionary, см. Альтернативный тип KeyValuePairs.

Кроме того, структуры Swift сохраняются, если их внутренние значения изменяются, переупорядочение поддерживает эти значения, когда вы присваиваете переупорядочение dict другим var / let, swift дает ссылку на первую структуру

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...