2017-02-16 223 views
0

我有一个字典数组。我需要对这个数组进行排序。排序不应该像升序或降序,但它应该基于另一个数组内容。 EX:假设我有一个数组nammed array_unsorted,该数组包含许多字典对象,如d1,d2,d3,d4等。每个字典对象都有一个名为key1的键,并且每个字典对象对于该键具有不同的值如KammyMaddy,Jessy。可以说我有anohter排序数组,其中Maddy,Kammy,Jessy。现在字典应该按照第一个元素应该是字典对象的方式排序,其中的值为key1 should be Maddy。如何根据Swift中的数组内容对字典数组进行排序

我无法使用SortDescriptor,因为这将根据传递给它的键以升序或降序排序。

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

任何帮助将非常感激。

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

+1

分享一些相关的代码会更清晰可读:) – ystack

+0

@iOS_Developer给我们一个可以编辑的输入和输出的例子,您可以期待它。 – Alexander

回答

1

如何:

创建一个新的空字典有String键,并输入字典的价值。称它为sourceItemsDict

循环遍历源数组中的字典,并将每个条目添加到新字典中,使用排序键作为字典键,并将数组条目作为值。

为您的排序结果创建一个新的,空的字典数组。称它为sortedArray

现在循环遍历您的数组,它具有所需的顺序。使用该密钥从sourceItemsDict中获取项目并将其附加到sortedArray的末尾。

应该这样做,它应该在O(n)时间内执行。

0

看看这个例子:

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) 
+0

这并没有解决OP问题。他们想对字典数组进行排序,以便字典中排序键的顺序与字符串数组匹配。 –

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

+0

非常感谢回复。这已经解决了我的一半问题。作为未指定的scnarios的一部分,“拉斯维加斯”应该结束,没有关键的失踪。并且它将它修复了一半,因为下一级排序(在这种情况下为城市)应该应用于已排序的(基于名称)数组。再次感谢。 –

相关问题