Swift:一个排序的字典

时间:2015-11-30 10:57:00

标签: swift dictionary

我学习迅速并试图理解词典。我已经习惯了PHP,你可以写下以下内容......

$dataPoints = Array("A"=>1,"B"=>2,"C"=>3);
foreach($dataPoints as $value) {
    echo($value);
}

在此示例中,值将按顺序输出 - 1,2,3

我的快速代码看起来像这样......

var dataPoints: Dictionary<String,Int> = ["A":1,"B":2,"C":3]
for (key, value) in dataPoints {
        print(value)
}

但是,这些值会以意想不到的顺序出现。有什么东西可以做,以保持值的创建顺序,或者一个快速的字典永远不会被排序?

5 个答案:

答案 0 :(得分:7)

正如已经回答的那样,字典的意思是它没有排序。 Swift(和Objective-C)中有三种类型的集合

数组是一个有序的项目列表。当项目的顺序很重要时使用它。

字典是键和值的无序集合。如果要根据键有效地检索值,请使用此选项。

套装是一包无序的独特物品。如果您想要一组没有特定顺序的唯一项目,请使用此选项。

对于您的情况,似乎排序对您来说很重要,但您希望存储某种值的值。也许您应该关注的是使用一组元组:

像这样的东西,也许

let dataPoints = [("A", 1), ("B", 2), ("C", 3)]

for (letter, number) in dataPoints {
    print("\(letter), \(number)")
}

输出

A, 1
B, 2
C, 3

<强>替代地

如果您在创建项目之前不知道项目的顺序,但是基于这些项目有自然顺序,您可以这样做:

let dict = [
    "A" : 1,
    "B" : 2,
    "C" : 3
]

for key in dict.keys.sort() {
    guard let value = dict[key] else { break }
    print("\(key), \(value)")
}

在这种情况下,您将获得一组具有默认排序顺序的键(如果您有其他要求,可以使用不同的排序函数)并根据排序顺序输出键值。

答案 1 :(得分:4)

来自Apple docs

  

与数组中的项目不同,字典中的项目没有指定的顺序。

所以,不,Swift词典永远不会“排序”。但是,谷歌快速搜索“Swift有序词典”将产生一些可满足您需求的实现:

例如:

https://github.com/lukaskubanek/OrderedDictionary

https://github.com/Marxon13/M13DataStructures/blob/master/Classes/OrderedDictionary.swift

Cocoapods也可以提供帮助:

https://cocoapods.org/?q=ordered%20dict

答案 2 :(得分:1)

在Swift 4中,您可以使用sorted(by:)返回字典元素(元组)的排序数组。因此,您问题中的代码变为:

var dataPoints = ["A":1,"B":2,"C":3]

var sortedDataPoints = dataPoints.sorted(by: { $0.value < $1.value })
// [(key: "A", value: 1), (key: "B", value: 2), (key: "C", value: 3)]

for (_, value) in sortedDataPoints {
    print(value)
}

答案 3 :(得分:1)

您现在可以使用官方 Apple Collections 库中的 OrderedDictionary: https://github.com/apple/swift-collections

答案 4 :(得分:0)

以防这是有用的,基于这里的响应,因为我从JSON源接收数据,我认为最好的方法是将我的字典转换为元组的排序数组。我为此创建了以下函数:

func dictionary_to_sorted_array(dict:Dictionary<String,Int>) ->Array<(key:String,value:Int)> {
    var tuples: Array<(key:String,value:Int)> = Array()
    let sortedKeys = (dict as NSDictionary).keysSortedByValueUsingSelector("compare:")
    for key in sortedKeys {
        tuples.append((key:key as! String,value:dict[key as! String]!))
    }
    return tuples
}

那么,我可以使用以下代码:

var dataPoints: Dictionary<String,Int> = ["A":1,"B":2,"C":3]
dataPointsArray(dictionary_to_sorted_array(dataPoints))
for dataPoint in dataPointsArray {
    print(dataPoint.value)
}

我非常喜欢swift的初学者,所以如果有人能更快地做到这一点,那就太棒了!