字典键如何在Swift中排序?

时间:2016-07-27 14:42:31

标签: swift sorting dictionary

检查以下字典:

var testDict: [String : Int] = [
    "a" : 1,
    "b" : 2,
    "c" : 3,
    "d" : 4
]

现在,遍历字典的键:

for i in testDict.keys {
    print(i)
}

这会生成以下输出:

  

b a c d

但是,预期输出将是编码顺序中的键:

  

a b c d

由于情况并非如此,我假设密钥已排序。如果是这样,它们如何排序,更重要的是,它们如何返回到它们的编写顺序?

2 个答案:

答案 0 :(得分:4)

来自Apple's docs

  

与数组中的项目不同,字典中的项目没有   指定的订单

简而言之,字典项目没有排序,它们的hashValue尽可能有效地存储(你不应该对订单做任何假设),这就是原因:

  

字典密钥类型必须符合Hashable协议,如a   设置值类型。

对于第二个问题,由于字典未排序,因此您无法将值或键内部返回到原始顺序(因为它没有任何内容)。您可以做的是按特定顺序遍历所有值和键,如下所示:

let dic = ["a" : 1, "b" : 2, "c" : 3, "d" : 4]
for key in dic.keys.sort(<) {
    print("key: \(key), value: \(dic[key])")
}

答案 1 :(得分:0)

字典(Swift或NSDictionary)是键值映射。概念没有顺序。您输入一个值(键)并为该键获取另一个值(值)。这不依赖于任何订单。

如果您想要订购密钥,请获取密钥并对其进行排序。

BTW:有序和有序之间存在差异。有序意味着元素保持它的位置。无论排序方式如何,此订单都可以是未排序的。

要显示差异,请考虑这样的字典创建:

var testDict: [String : Int] = [
  "b" : 2,
  "a" : 1,
  "c" : 3,
  "d" : 4
]

如果将订购字典,则代码的结果将为:b,a,c,d。这是创建字典的 order 。但它没有排序。 (排序如何?拼音?字面意思?字母数字?)

有序的数组(也就是保留元素的位置)也没有排序。将同质有序集合作为NSArray保持顺序,即使无法对它们进行排序:想想包含字符串,数字和图像的数组。数组保持您放置项目的顺序。但它不知道对它进行排序。 (同样:无论排序是什么意思。)在Swift,Objective-C和Foundation的整个生物圈中,只有一个排序集合:NSIndexSet