【问题标题】:Generate Sorted Dictionary by Letters from an Array Swift从数组 Swift 中按字母生成排序字典
【发布时间】:2016-02-17 07:59:46
【问题描述】:

我有一个部门名称数组

var departments: Array<String>!

我想在字典中按字母顺序对这个数组进行排序,例如字典应该是这样的

var MyDictionary = ["A": ["Affenpoo", "Affenpug", "Affenshire", "Affenwich", "Afghan Collie", "Afghan Hound"], "B": ["Bagle Hound", "Boxer"],
    "C": ["Cagle Cound", "Coxer"]]

部门数组不是静态的

如何快速生成这本词典?

非常感谢

【问题讨论】:

  • 字典按定义是无序的。
  • 迭代数组。取每个条目的第一个字母。从字典中检索该字母的数组。如果它是 nil,则使用该单词创建一个新数组并将其添加到字典中。如果不为零,则将单词添加到您检索的数组中。
  • 如果没有以'B'开头的部门怎么办?
  • @vadian 我的目标是让所有以相同字母开头的部门与字典中的相同键相关联
  • @Paulw11 的建议是一个合适的解决方案。

标签: ios arrays xcode swift dictionary


【解决方案1】:

我的方法是迭代数组并获取每个条目的第一个字母。从字典中检索该字母的数组。如果为 nil,则创建一个新数组。将单词添加到您检索到的数组中,然后将数组存储在字典中。

let departments = ["Affenpoo", "Affenpug", "Affenshire", "Affenwich", "Afghan Collie","Cagle Cound", "Coxer"]
var outputDict=[String:[String]]()

for word in departments {
    let initialLetter=word.substringToIndex(word.startIndex.advancedBy(1)).uppercaseString
    var letterArray=outputDict[initialLetter] ?? [String]()
    letterArray.append(word)
    outputDict[initialLetter]=letterArray
}

print(outputDict)

[“C”:[“Cagle Cound”,“Coxer”],“A”:[“Affenpoo”,“Affenpug”,“Affenshire”,“Affenwich”,“阿富汗牧羊犬”]]

【讨论】:

  • 为什么 C 在 A 之前
  • 这是一本字典。字典是无序的
【解决方案2】:

编辑:Paulw11 的解决方案更有效

我认为这个问题与 swift 无关,但无论如何试试这个:

let a = ["All", "Cat", "red", "gat", "Star sun", "bet you", "Zeta Fog", "Tea", "Fox"]

let b = a.map{ $0.lowercaseString }

let c = b.sort()
let d = c.map{ $0[$0.startIndex.advancedBy(0)]}

var dictionary:[String:[String]] = [:]
let byInitial = d.map{ initial in

    let clustered = c.filter{$0.hasPrefix("\(initial)")}
    dictionary.updateValue(clustered, forKey:"\(initial)")
}
print("\(dictionary)")

【讨论】:

  • 由于在外部迭代中调用let clustered = c.filter{$0.hasPrefix("\(initial)")},此解决方案为 O(n^2)
  • 是的,它是 O(n^2)。 OP 没有提到复杂性限制。
  • 不过,当有一个简单的 O(n) 解决方案时避免 O(n^2) 是常识
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多