【问题标题】:Sort dictionary by value in swift快速按值对字典进行排序
【发布时间】:2020-05-25 10:17:33
【问题描述】:

我有一本字典为[String: [String]]。数据看起来像,

Province
  |- State 1
  |    |- A
  |    |- C
  |    |- E
  |- State 2
       |- B
       |- A
       |- D

我尝试将其排序为,

let sortedResult = plistData.sorted{ $0.key < $1.key }.map { [$0.key: $0.value.sorted()] }

但这给了我一个[[String : [String]]] 类型的数组。我该如何解决这个问题以获得 [String : [String]]。?需要按所有值排序

【问题讨论】:

  • 你不能在 Swift 中对字典进行排序。根据定义,键没有特定的顺序。您可以维护一个单独的排序键数组,可以完成您想要的。
  • 我想按值排序。 State 2 的 A,C,E 数组应该是 State 2 -> A, B, D
  • 您可以对数组的值进行排序,但不能对键进行排序,因为字典不会保持特定的顺序。因此,在您的示例中,State 1State 2 可能以任何顺序出现。
  • 是的。我想对数组中的值进行排序
  • 你需要在问题中指定这个。

标签: arrays swift sorting


【解决方案1】:

在 cmets 中,您指定要对值数组进行排序。您可以使用mapValuessorted 来完成此操作,如下所示:

let sortedResult = plistdata.mapValues { $0.sorted() }

注意:Swift 中的字典是无序的(没有指定的顺序),因此不可能将键按特定顺序排列。如果您想以特定的排序顺序显示键,请使用 let sortedKeys = plistdata.keys.sorted() 将它们排序到单独的数组中。

【讨论】:

  • 感谢您的回答。但是当我使用不同的语言环境时,我该如何用另一种语言对其进行排序?
  • 在这种情况下,你如何获得你想要显示的字符串?
  • 从 plist(仅英文)文件中读取所有内容并使用代码对其进行本地化
  • 首先像这样创建您的本地化结构,然后对其进行排序:let localizedDict = Dictionary(uniqueKeysWithValues: plistdata.map { (k, v) in (k.localized, v.map { x in x.localized })})
  • 只是一个警告,如果你有两个本地化到同一个字符串的状态,那么 Dictionary(uniqueKeysWithValues) 将由于重复键而崩溃。
【解决方案2】:

字典无法排序,它们不会像数组一样保持位置。您可以对键进行排序,然后从排序后的键中获取字典中的值:

let dictionary = [String: [String]]()
print(dictionary.keys.sorted())
for key in dictionary.keys.sorted() {
    print(dictionary[key]?.sorted())
}

编辑:我看到你在 cmets 中提到了需求变化。如果您只想对值进行排序,这里的方法是:

let dictionary = [String: [String]]()
let sortedDictionary = dictionary.mapValues { $0.sorted() }

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2021-07-05
    相关资源
    最近更新 更多