Swift - сортировка и разделение массива словарей - PullRequest
0 голосов
/ 15 мая 2018

Есть ли способ эффективной сортировки массива словарей на основе значения параметра и возврата отдельных массивов для каждого из этих значений параметра?

Пример массива:

[["value":3, "groupID":1],
["value":5, "groupID":2],
["value":2, "groupID":1],
["value":6, "groupID":3],
["value":1, "groupID":2],
["value":9, "groupID":3]]

Требуемый возвратвыход 1 (отсортированный массив):

[["value":2, "groupID":1],
["value":3, "groupID":1],
["value":1, "groupID":2],
["value":5, "groupID":2],
["value":6, "groupID":3],
["value":9, "groupID":3]]

Требуемый возврат 2 (разделить массивы по параметру):

[["value":2, "groupID":1],
["value":3, "groupID":1]]

[["value":1, "groupID":2],
["value":5, "groupID":2]]

[["value":6, "groupID":3],
["value":9, "groupID":3]]

Одно решение, которое я придумал, довольно медленное, а именно::

//variable array is the master array of dictionaries

var sorted = [[Int:Int]]() 
//(Output 1) sorted is the sorted array
sorted = array.sorted { t1, t2 in
                if t1.groupID == t2.groupID {
                    return t1.value < t2.value
                }
                return t1.groupID < t2.groupID
            }

var separated = [Int:[Int:Int]]() 
//(Output 2) separated is a dictionary that contains separate arrays, all of which have the same of a designated property. Essentially the same thing as separate, distinct arrays sorted by parameter for Output 2
separated = [
            for i in 0..<sorted.count {
                separated[sorted[i].channel]?.append(sorted[i])
            }

Есть мысли, как сделать это быстрее?Спасибо!

Ответы [ 2 ]

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

Вот простой однострочный подход, который может помочь вам начать:

let d = Dictionary.init(grouping: array) {$0["groupID"]!}

В результате получается словарь , ключом которого является значение groupID:

["1": [["groupID": "1", "value": "3"], ["groupID": "1", "value": "2"]],
 "2": [["groupID": "2", "value": "5"], ["groupID": "2", "value": "1"]],  
 "3": [["groupID": "3", "value": "6"], ["groupID": "3", "value": "9"]]]

Ну, подумай об этом результате. значения словаря являются вашими тремя "желаемыми выходными" массивами:

[["value":"2", "groupID":"1"],
["value":"3", "groupID":"1"]]

[["value":"1", "groupID":"2"],
["value":"5", "groupID":"2"]]

[["value":"6", "groupID":"3"],
["value":"9", "groupID":"3"]]

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

Получение отсортированного массива single тривиально.

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

Это не красивая реализация, похоже, она работает, но не уверена, что быстрее, чем у вас:

let array: [[String: String]] = [["value":"3", "groupID":"1"],
             ["value":"5", "groupID":"2"],
             ["value":"2", "groupID":"1"],
             ["value":"6", "groupID":"3"],
             ["value":"1", "groupID":"2"],
             ["value":"9", "groupID":"3"]]

// grouping
var dict: [String: [[String: String]]] = [:]
array.forEach { (element) in
    var elements: [[String: String]] = []
    let groupID = element["groupID"]!
    if dict.keys.contains(groupID) {
        elements = dict[groupID]!
    }
    elements.append(element)
    dict[groupID] = elements
}

// spliting and sorting
var final: [[String: [[String: String]]]] = []
dict.keys.sorted().forEach { (key) in
    let sorted = dict[key]!.sorted(by: { $0["value"]! < $1["value"]! })
    final.append([key: sorted])
}

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