Ios 如何根据Swift中的数组内容对字典数组进行排序
我有一系列字典。我需要对数组进行排序。排序不应类似于升序或降序,但应基于另一个数组内容。 例如:假设我有一个数组nammedIos 如何根据Swift中的数组内容对字典数组进行排序,ios,arrays,swift,Ios,Arrays,Swift,我有一系列字典。我需要对数组进行排序。排序不应类似于升序或降序,但应基于另一个数组内容。 例如:假设我有一个数组nammedarray\u unsorted,该数组包含许多字典对象,如d1、d2、d3、d4等。每个字典对象都有一个名为key1的键,每个字典对象对该键有不同的值,例如Kammy、Maddy、Jessy。假设我有另一个排序数组,Maddy,Kammy,Jessy。现在,字典的排序方式应该是,第一个元素应该是dictionary对象,key1的值应该是Maddy` 我不能使用SortD
array\u unsorted
,该数组包含许多字典对象,如d1、d2、d3、d4等。每个字典对象都有一个名为key1
的键,每个字典对象对该键有不同的值,例如Kammy
、Maddy
、Jessy
。假设我有另一个排序数组,Maddy
,Kammy
,Jessy
。现在,字典的排序方式应该是,第一个元素应该是dictionary对象,key1的值应该是
Maddy`
我不能使用SortDescriptor,因为它将根据传递给它的键按升序或降序排序
我已经尝试了我的解决方案,但最终使用了太多嵌套循环。我觉得我的解决方案太可怜了,我甚至不想在这里发布代码
任何帮助都将不胜感激
编辑:可以有多个排序数组,但现在我只考虑一个排序数组,然后我可以为多个排序数组编写代码 这个怎么样:
使用字符串
键和dictionary类型的值创建一个新的空字典。称之为sourceItemsDict
循环遍历源数组中的字典,将每个条目添加到新字典中,使用排序键作为字典键,并将数组条目作为值
为排序结果创建一个新的空字典数组。称之为SorterDarray
现在循环遍历具有所需顺序的数组。使用该键从sourceItemsDict
获取项目,并将其附加到sortedArray
的末尾
这样就可以了,它应该在O(n)时间内执行。这个怎么样:
使用字符串
键和dictionary类型的值创建一个新的空字典。称之为sourceItemsDict
循环遍历源数组中的字典,将每个条目添加到新字典中,使用排序键作为字典键,并将数组条目作为值
为排序结果创建一个新的空字典数组。称之为SorterDarray
现在循环遍历具有所需顺序的数组。使用该键从sourceItemsDict
获取项目,并将其附加到sortedArray
的末尾
这应该可以做到,并且应该在O(n)时间内执行。查看此示例:
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)
看看这个例子:
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)
试试这个:
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)
拉斯维加斯应该出现在排序数组的开头还是结尾
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"])
现在,艾米应该放在哪里?试试这个:
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)
拉斯维加斯应该出现在排序数组的开头还是结尾
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应该放在哪里?共享一些相关的代码会更清晰:)@iOS\u Developer给我们一个你期望从中获得的可编译输入和输出的例子。共享一些相关的代码会更清晰:)@iOS\u Developer给我们一个你期望从中获得的可编译输入和输出的例子。那就是不能解决老年退休金问题。他们希望对字典数组进行排序,以便字典中排序键的顺序与字符串数组匹配,但这并不能解决OPs问题。他们希望对字典数组进行排序,以便字典中排序键的顺序与字符串数组匹配。非常感谢您的回复。这已经解决了我的一半问题。作为未指定scnarios的一部分,
Las Vegas
应该在末尾,并且没有钥匙丢失。它将其修复了一半,因为下一级排序(本例中为城市)应应用于已排序(基于名称)数组。再次非常感谢。非常感谢您的回复。这已经解决了我的一半问题。作为未指定scnarios的一部分,Las Vegas
应该在末尾,并且没有钥匙丢失。它将其修复了一半,因为下一级排序(本例中为城市)应应用于已排序(基于名称)数组。再次非常感谢。