【问题标题】:Swift - sorting and separating array of dictionariesSwift - 排序和分离字典数组
【发布时间】:2018-10-25 16:08:00
【问题描述】:

有没有一种方法可以根据参数值有效地对字典数组进行排序并为每个参数值返回单独的数组?

示例数组:

[["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 是什么意思,因为它是三件事,而不是一件事。
  • 输出 1 是一个单一数组的返回。输出 2 是三个独立数组的返回。我正在寻找一种可以快速同时输出输出 1 和 2(一个大的单个数组,然后是一组分离的数组)的函数。
  • 我不明白是什么意思。一个函数有一个输出。
  • 你可以在 swift 中拥有多个输出函数...... 例如:func abc() -> ([Int],[String])

标签: arrays swift sorting dictionary


【解决方案1】:

这里有一个简单的单行方法,可以帮助您入门:

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"]]]

好吧,想想那个结果。字典的 values 是您的三个“期望输出”数组:

[["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 按键排序,然后深入每个数组。

导出单个排序数组很简单。

【讨论】:

  • 这很棒。在获得单个排序数组后,这是一种优雅的单线使用,并且运行速度比我原来的实现快得多。谢谢!
【解决方案2】:

这不是一个漂亮的实现,看起来它可以工作,但不确定是否比你的更快:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多