如何根据Swift

时间:2017-02-16 21:06:07

标签: ios arrays swift

我有一个字典数组。我需要对该数组进行排序。排序不应该像升序或降序,但应该基于另一个数组内容。 EX:假设我有一个数组nammed array_unsorted,该数组包含很多字典对象,如d1,d2,d3,d4等。每个字典对象都有一个名为key1的密钥和每个字典对象具有该关键字的不同值,例如KammyMaddyJessy。假设我有一个{!1}},MaddyKammy的anohter排序数组。现在,字典应该按照第一个元素应该是字典对象的方式进行排序,其中Jessy Maddy`的值。

我不能使用SortDescriptor,因为它会根据传递给它的键按升序或降序排序。

我已经尝试过我的解决方案,但我最终使用了这么多嵌套循环。我觉得我做的解决方案如此可怜,以至于我甚至不想在这里发布代码。

任何帮助都会非常感激。

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

3 个答案:

答案 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