[英]How do I sort an array of dictionary according to an array contents in Swift
我有一系列的字典。 我需要对该数组进行排序。 排序不应该像升序还是降序,但是它应该基于另一个数组的内容。 EX:假设我有一个命名为array_unsorted
的数组,并且该数组包含很多字典对象,例如d1,d2,d3,d4等。每个字典对象都有一个称为key1
的键,每个字典对象具有该键的不同值,例如作为Kammy
, Maddy
, Jessy
。 可以说我有anohter有序阵列Maddy
, Kammy
, Jessy
。 现在,应该按照以下方式对字典进行排序:第一个元素应该是字典对象,其中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.