Arrays Swift-字典的排序和分离数组

Arrays Swift-字典的排序和分离数组,arrays,swift,sorting,dictionary,Arrays,Swift,Sorting,Dictionary,有没有一种方法可以根据参数值对字典数组进行有效排序,并为每个参数值返回单独的数组 示例阵列: [["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(排序数组): 期望返回输出2(按参数分隔的数组): 我提出的一个解决方案

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

示例阵列:

[["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(排序数组):

期望返回输出2(按参数分隔的数组):

我提出的一个解决方案相当缓慢,那就是:

//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])
            }
//变量数组是字典的主数组
变量排序=[[Int:Int]]()
//(输出1)sorted是已排序的数组
排序=数组。排序{t1,t2英寸
如果t1.groupID==t2.groupID{
返回t1.value对于0中的i..它不是一个漂亮的实现,看起来可以工作,但不确定是否比您的更快:

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)
let数组:[[String:String]=[[“value”:“3”,“groupID”:“1”],
[“值”:“5”,“组ID”:“2”],
[“值”:“2”,“组ID”:“1”],
[“值”:“6”,“组ID”:“3”],
[“值”:“1”,“组ID”:“2”],
[“值”:“9”,“组ID”:“3”]]
//分组
变量dict:[String:[[String:String]]=[:]
数组中的array.forEach{(元素)
变量元素:[[String:String]]=[]
让groupID=element[“groupID”]!
如果dict.keys.contains(groupID){
elements=dict[groupID]!
}
元素。追加(元素)
dict[groupID]=元素
}
//拆分和排序
变量final:[[String:[[String:String]]]=[]
dict.keys.sorted().forEach{(键)在
let sorted=dict[key]!.排序(按:{$0[“value”]!<$1[“value”]!})
final.append([键:排序])
}
打印(最终版)

这里有一个简单的单行方法,可以让您开始:

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"]]]
好吧,想想这个结果。字典的值是您的三个“期望输出”数组:

您可以将这些值作为字典的
访问,也可以使用
按键排序,然后深入到每个数组中


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

甚至不清楚输出2的含义,因为它是三件事,而不是一件事。输出1是一个单个数组的返回。输出2是三个单独数组的返回。我正在寻找一个可以快速同时输出输出1和2的函数(一个大的单数组,然后是一组分离的数组)。我不明白什么意思。一个函数有一个输出。你可以在swift中有多个输出函数…例如:func abc()->([Int],[String])这太棒了。在获得单排序数组后,它是一个优雅的单行程序用法,并且比我最初的实现快得多。谢谢!
let d = Dictionary.init(grouping: array) {$0["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"]]