【问题标题】:Create array with key from dict with sorted by dict values使用字典中的键创建数组,并按字典值排序
【发布时间】:2017-06-18 08:45:10
【问题描述】:

我有一本字典,我想在表格视图中进行迭代。一种方法是创建一个包含所有键的数组,然后只获取给定索引处的键。但是对于这个数组,我希望键按字典中的值按字母顺序排列。我该怎么做?

static let dict = [
            "0P0000KBNA": "Länsförsäkringar Europa Indexnära",
            "0P0000YVZ3": "Länsförsäkringar Global Indexnära",
            "0P0000J1JM": "Länsförsäkringar Sverige Indexnära",
            "0P00013668": "Länsförsäkringar Tillväxtmarknad Indexnära A",
            "0P0000K9E7": "Länsförsäkringar USA Indexnära",
            "0P00005U1J": "Avanza Zero"
        ]

        static let sortedKeys = Array(dict.keys) // How?

【问题讨论】:

  • 对不起,如果不清楚,但是是的,我想按字母顺序对值进行排序。我的意思是在我的情况下,我将用来指向正确键(sortedKeys [section])的节整数。

标签: arrays swift sorting dictionary


【解决方案1】:

您只需要按值对字典进行排序并映射键

let sortedKeys = dict.sorted{$0.value < $1.value}.map{$0.key}   // ["0P00005U1J", "0P0000KBNA", "0P0000YVZ3", "0P0000J1JM", "0P00013668", "0P0000K9E7"]

【讨论】:

  • 如果您需要本地化排序 let sortedKeys = dict.sorted{$0.value.localizedCompare($1.value) == .orderedAscending }.map{$0.key} 或 bashir let sortedKeys = dict.sorted{$0.value.localizedCaseInsensitiveCompare($1.value) == .orderedAscending }.map{$0.key} 建议的不区分大小写的排序
【解决方案2】:

作为@LeoDabus answer 的一个小变体,您可以访问字典的keys 属性并根据每个键对应的value 对该数组进行排序

let sortedKeys = dict.keys.sorted { dict[$0]! < dict[$1]! }
print(sortedKeys)
/* ["0P00005U1J", 
    "0P0000KBNA", 
    "0P0000YVZ3",
    "0P0000J1JM",
    "0P00013668", 
    "0P0000K9E7"] */

还请注意,通常要避免强制展开运算符 !,但在这种特殊情况下,我们知道提供给 sorted(...) 的谓词闭包中的速记参数 $0$1 保证是字典中的有效键(因为你的字典是不可变的:所以这里没有异步风险)。

【讨论】:

  • 很好的方法,强制解包永远不会失败。本地化版本let sortedKeys = dict.keys.sorted { dict[$0]!.localizedCompare(dict[$1]!) == .orderedAscending }
  • @LeoDabus 谢谢,同样感谢!正如最后一个子句中所提示的,在此示例中展开不会失败,但如果 dict 是静态可变属性(在这种情况下竞争条件可能会搞砸!),则应避免。
  • 看看你的方法或 Leo 的方法中哪一个更快会很有趣——因为这避免了map(_:),但在使用字典的下标时会进行额外的一轮哈希和相等检查。
  • @Hamish 我的猜测是 Leos 方法;因为在我的方法will perform the map(_:) call anyway 中访问了计算出的keys 属性(虽然很懒惰)。
  • @dfri 刚刚运行了一个快速基准测试,看起来 Leo 的速度确实更快——尽管我不认为 keys 属性是瓶颈,因为在这种情况下,惰性映射应该很少开销(如果你改为使用dict.sorted { dict[$0.key]! &lt; dict[$1.key]! },它对结果几乎没有影响),这让我认为它是散列和相等检查是减速的根源。
【解决方案3】:

首先,创建一个名为 keysArray 的新字符串数组。

其次,遍历您的字典数组并将所有键添加到新创建的数组中。

现在 keysArray 应该是键的数组。

三、排序sortedKeysArray如下

var sortedArray = sortedKeysArray.sorted { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending}

现在我们有了一个排序后的 Key 数组。

在此之后,如果您需要一个字典数组,请创建一个名为 sortedDictArray 的新数组。然后遍历我们之前创建的 sortedKeysArray 并通过键获取字典并将其添加到 sortedDictArray。中提琴!

希望对您有所帮助!

【讨论】:

  • 您看错了问题。 OP希望它按值而不是键排序
【解决方案4】:

有序字典

我使用了 Lukas Kubanek 创建的开源 OrderedDictionary 来解决此类问题。

关于这个库的使用可以参考example playground

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 2015-10-10
    • 2019-06-25
    • 2017-08-20
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    相关资源
    最近更新 更多