Как отсортировать словарь по ключам и отсортировать соответствующие значения в Swift - PullRequest
0 голосов
/ 11 мая 2018

У меня есть словарь со строкой в ​​качестве ключа и массивом int в качестве значений, мне нужно отсортировать словарь на основе ключей, и значение массива также должно быть отсортировано.

var dicNumArray : Dictionary<String , [Int]> = ["q":[4,3,2,1,5],"a":[2,3,4,5,5],"s":[123,123,132,43,4],"t":[0,88,66,542,321]]

В результате мне нужен сам словарь, в котором он отсортирован по ключам, а также отсортированы соответствующие значения.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

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

let sortedKeysAndValues = dicNumArray.sorted(by: {$0.0 < $1.0}).map { [$0.key:$0.value.sorted(by: <)]}.flatMap({$0})
0 голосов
/ 11 мая 2018

В словарях нет порядка в Swift. Сказав это, вы можете сделать что-то вроде этого

var dicNumArray : Dictionary<String , [Int]> = ["q":[4,3,2,1,5],"a":[2,3,4,5,5],"s":[123,123,132,43,4],"t":[0,88,66,542,321]]

func sortData() {
    for (key, value) in dicNumArray {
        dicNumArray[key] = value.sorted(by: { $0 < $1 })
    }
}

sortData()

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

let keys = Array(dicNumArray.keys).sorted(by: { $0 < $1 })

Это даст вам отсортированный массив словарных ключей. Вы можете проверить это следующим образом

TEST

for key in keys {
    print("\(key): \(dicNumArray[key]!)")
}

OUTPUT

a: [2, 3, 4, 5, 5]
q: [1, 2, 3, 4, 5]
s: [4, 43, 123, 123, 132]
t: [0, 66, 88, 321, 542]
0 голосов
/ 11 мая 2018

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

И затем, вы можете просто использовать sorted с предикатом, сравнивающим ключисловаря.

let result = dicNumArray.mapValues { $0.sorted() }
                        .sorted { $0.key < $1.key }

Это вернет массив парных пар ключ-значение.

Поскольку словарям нельзя доверять с порядком, работая с массивом ключейПары значений - следующий лучший подход.

Мы можем использовать .key и .value для получения соответствующих значений.

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