Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何根据Swift中的数组内容对字典数组进行排序_Ios_Arrays_Swift - Fatal编程技术网

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

Ios 如何根据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

我有一系列字典。我需要对数组进行排序。排序不应类似于升序或降序,但应基于另一个数组内容。 例如:假设我有一个数组nammed
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
应该在末尾,并且没有钥匙丢失。它将其修复了一半,因为下一级排序(本例中为城市)应应用于已排序(基于名称)数组。再次非常感谢。