我有一个字典数组。我需要对该数组进行排序。排序不应该像升序或降序,但应该基于另一个数组内容。
EX:假设我有一个数组nammed array_unsorted
,该数组包含很多字典对象,如d1,d2,d3,d4等。每个字典对象都有一个名为key1
的密钥和每个字典对象具有该关键字的不同值,例如Kammy
,Maddy
,Jessy
。假设我有一个{!1}},Maddy
,Kammy
的anohter排序数组。现在,字典应该按照第一个元素应该是字典对象的方式进行排序,其中Jessy
Maddy`的值。
我不能使用SortDescriptor,因为它会根据传递给它的键按升序或降序排序。
我已经尝试过我的解决方案,但我最终使用了这么多嵌套循环。我觉得我做的解决方案如此可怜,以至于我甚至不想在这里发布代码。
任何帮助都会非常感激。
编辑:可以有多个排序数组,但截至目前我只考虑一个排序数组,然后我可以为多个排序数组编写代码。答案 0 :(得分:1)
这个怎么样:
使用String
键创建一个新的空字典,并输入Dictionary类型的值。称之为sourceItemsDict
。
循环遍历源数组中的字典,并使用排序键作为字典键将每个条目添加到新字典中,并将数组条目作为值。
为排序结果创建一个新的空字典数组。称之为sortedArray
。
现在循环遍历具有所需顺序的数组。从sourceItemsDict
获取包含该密钥的项目,并将其附加到sortedArray
的末尾。
应该这样做,它应该在O(n)时间内执行。
答案 1 :(得分:1)
试试这个:
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
的位置?
答案 2 :(得分:0)
看看这个例子:
e