繁体   English   中英

如何根据Swift中的数组内容对字典数组进行排序

[英]How do I sort an array of dictionary according to an array contents in Swift

我有一系列的字典。 我需要对该数组进行排序。 排序不应该像升序还是降序,但是它应该基于另一个数组的内容。 EX:假设我有一个命名为array_unsorted的数组,并且该数组包含很多字典对象,例如d1,d2,d3,d4等。每个字典对象都有一个称为key1的键,每个字典对象具有该键的不同值,例如作为KammyMaddyJessy 可以说我有anohter有序阵列MaddyKammyJessy 现在,应该按照以下方式对字典进行排序:第一个元素应该是字典对象,其中key1 should be的值key1 should be Maddy`。

我不能使用SortDescriptor,因为这将基于传递给它的键以升序或降序排序。

我已经尝试过解决方案,但最终却使用了许多嵌套循环。 我觉得我所做的解决方案是如此可悲,我什至不想在这里发布代码。

任何帮助将不胜感激。

编辑:可以有多个排序数组,但到目前为止,我只考虑一个排序数组,然后可以为多个排序数组编写代码。

这个怎么样:

创建一个新的空字典,使用String键和一个类型为Dictionary的值。 将其sourceItemsDict

循环遍历源数组中的字典,然后使用排序键作为字典键,将每个条目添加到新字典中,然后将数组条目作为值。

为您的排序结果创建一个新的空字典数组。 称之为sortedArray

现在循环遍历具有所需顺序的数组。 sourceItemsDict获取带有该键的项,并将其附加到sortedArray

这样就可以了,它应该在O(n)时间内执行。

尝试这个:

func sort<T: Equatable>(arrayOfDict arr: [[String: T]], by key: String, order: [T]) -> [[String: T]] {
    return arr.sorted {
        guard let value0 = $0[key], let value1 = $1[key] else {
            return false
        }
        guard let index0 = order.index(of: value0), let index1 = order.index(of: value1) else {
            return false
        }

        return index0 < index1
    }
}

let array_unsorted = [
    ["name": "Kammy", "city": "New York"],
    ["name": "Maddy", "city": "Cupertino"],
    ["name": "Jessy", "city": "Mountain View"]
]
let sortedByName = sort(arrayOfDict: array_unsorted, by: "name", order: ["Maddy", "Kammy", "Jessy"])
let sortedByCity = sort(arrayOfDict: array_unsorted, by: "city", order: ["Cupertino", "Mountain View", "New York"])

print(sortedByName)
print(sortedByCity)

您的问题留下了一些未解决的方案:

1:如果字典中缺少键怎么办?

let array_unsorted = [
    ["name": "Kammy", "city": "New York"],
    ["city": "Las Vegas"],
    ["name": "Maddy", "city": "Cupertino"],
    ["name": "Jessy", "city": "Mountain View"]
]

let sortedByName = sort(arrayOfDict: array_unsorted, by: "name", order: ["Maddy", "Kammy", "Jessy"])

拉斯维加斯应该出现在已排序数组的开头还是结尾?

2:如果不指定值的顺序怎么办?

let array_unsorted = [
    ["name": "Amy"],
    ["name": "Kammy", "city": "New York"],
    ["name": "Maddy", "city": "Cupertino"],
    ["name": "Jessy", "city": "Mountain View"]
]

let sortedByName = sort(arrayOfDict: array_unsorted, by: "name", order: ["Maddy", "Kammy", "Jessy"])

现在应该把Amy放在哪里?

看看这个例子:

let dic1 = ["name" : "a"]
let dic2 = ["name" : "b"]
let dic3 = ["name" : "c"]
let dic4 = ["name" : "d"]
let dic5 = ["name" : "e"]


let unsorted_array = [dic2,dic5,dic1,dic4,dic3]

func sortArrayByName(_ array:[[String:String]])->[[String:String]]{
    var sortedArray:[[String:String]] = [[String:String]]()
    var sortingOrder:[String] = [String]()
    for eachDic in array{
        if let name = eachDic["name"]{
            sortingOrder.append(name)
            sortingOrder.sort() // sorting logic here

            if sortedArray.isEmpty{
                sortedArray.append(eachDic)
            } else {
                let index = sortingOrder.index(of: name)!
                sortedArray.insert(eachDic, at: index)
            }
        }
    }

    return sortedArray
}

let sorted_array = sortArrayByName(unsorted_array)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM