Arrays 使用按dict值排序的dict中的键创建数组

Arrays 使用按dict值排序的dict中的键创建数组,arrays,swift,sorting,dictionary,Arrays,Swift,Sorting,Dictionary,我有一个字典,我想在tableview中迭代。实现这一点的一种方法是创建一个包含所有键的数组,然后只在给定索引处获取键。但是对于这个数组,我希望键按照字典中的值按字母顺序排列。我该怎么做 static let dict = [ "0P0000KBNA": "Länsförsäkringar Europa Indexnära", "0P0000YVZ3": "Länsförsäkringar Global Indexnära",

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

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?

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

其次,在字典数组上循环并将所有键添加到新创建的数组中

现在keysArray应该是一个键数组

第三,按如下方式对Eysarray进行排序

var sortedArray = sortedKeysArray.sorted { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending}
现在我们有了一个排序键数组

在此之后,若您需要一个字典数组,请创建一个名为sortedDictArray的新数组。然后循环我们之前制作的sortedKeysArray,按键获取字典并将其添加到sortedDictArray。中提琴


希望这对你有帮助

您只需按值对字典排序并映射键即可

let sortedKeys = dict.sorted{$0.value < $1.value}.map{$0.key}   // ["0P00005U1J", "0P0000KBNA", "0P0000YVZ3", "0P0000J1JM", "0P00013668", "0P0000K9E7"]
let sortedKeys=dict.sorted{$0.value<$1.value}.map{$0.key}/[“0P00005U1J”、“0P0000KBNA”、“0P0000YVZ3”、“0P0000J1JM”、“0P00013668”、“0P0000K9E7”]
作为的一个小变化,您可以访问字典的
属性,并根据每个键对应的
值对该数组进行排序

let sortedKeys = dict.keys.sorted { dict[$0]! < dict[$1]! }
print(sortedKeys)
/* ["0P00005U1J", 
    "0P0000KBNA", 
    "0P0000YVZ3",
    "0P0000J1JM",
    "0P00013668", 
    "0P0000K9E7"] */
让sortedKeys=dict.keys.sorted{dict[$0]!
还请注意,强制展开运算符
通常是要避免的,但在这种特殊情况下,我们知道提供给
排序(…)
的谓词闭包中的速记参数
$0
$1
都保证是字典中的有效键(因为您的字典是不可变的:所以这里没有异步风险)。

有序字典 我使用Lukas Kubanek创建的开放源代码来解决类似的问题


关于此库的用法,您可以参考。

如果不清楚,很抱歉,但我想按字母顺序对值进行排序。在我的例子中,我指的索引是节整数,我将使用它指向正确的键(sortedKeys[section])。你看错了问题。如果您需要本地化排序
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建议的不区分大小写排序,OP希望它按值而不是按键排序{$0.key}
Nice方法和强制展开将永远不会失败。本地化版本
let sortedKeys=dict.keys.sorted{dict[$0]!.localizedCompare(dict[$1]!)==.orderedAscending}
@LeoDabus谢谢,同样!正如最后一句中所提示的,在本例中,展开不会失败,但如果
dict
是静态可变属性(在这种情况下,竞争条件可能会把事情搞砸!),则应避免此操作。我很想看看您或Leo的方法中哪一种会更快–因为这避免了
映射(:)
,但在使用字典的下标时会进行额外的哈希和相等性检查。@Hamish我猜应该是Leos方法;因为在我的方法中访问计算的
属性(虽然很懒)。@dfri刚刚运行了一个快速的基准测试,看起来Leo的速度更快——尽管我不认为
keys
属性是瓶颈,因为在这种情况下,惰性映射应该有相当小的开销(如果您执行
dict.sorted{dict[$0.key]!
,它对结果几乎没有影响),这让我觉得是散列和平等性检查导致了速度的下降。