按值对 Swift 字典进行排序

7

我有一个字典,[String : Double],其中包含以下数据:

Museum1 : 8785.8971799638
Museum2 : 34420.9643422388
Museum3 : 826.467789130732
Museum4 : 304120.342151219

我希望能够按照双精度值对字典进行排序。我做了一些研究,但是所有的示例都已过时,不适用于当前版本的Swift。
我尝试使用来自Sort Dictionary by values in Swift的此代码:
for (k,v) in Array(self.museumsDic).sorted({$0.0 < $1.0}) {
    println("\(k):\(v)")
}

但是它没有起作用。我该如何按其值对字典进行排序?

字典没有顺序,那么“排序”字典意味着什么?你真正想做什么? - matt
1
你所说的“它没起作用”是什么意思?那毫无意义。只有期望和实际结果。你期望发生什么,实际上又发生了什么? - matt
3个回答

14

不清楚你的期望是什么。其实并没有所谓的已排序字典。除了一个错放的括号之外,您的代码基本上是正确的。我尝试了这个:

let d = ["Museum1":8785.8971799638,
"Museum2":34420.9643422388,
"Museum3":826.467789130732,
"Museum4":304120.342151219]

for (k,v) in (Array(d).sorted {$0.1 < $1.1}) {
    println("\(k):\(v)")
}

结果:

Museum3:826.467789130732
Museum1:8785.8971799638
Museum2:34420.9643422388
Museum4:304120.342151219

如果您认为这是错误的,那么您需要解释为什么。


谢谢,非常完美。第二个数字是用户与博物馆列表之间的距离。我正在尝试确定最靠近用户位置的博物馆。所以是的,这就是我想要的,非常感谢。 - user986690
3
我需要解释这段代码,因为它非常难以理解。Array(d)将字典转换为数组,数组中的每个元素都是字典中的键值对组成的元组。符号$0.1允许在元组内引用。它实际上是按照第二项即值来排序元组。排序结果仍然是一个由元组组成的数组,可以通过“for (k, v)”进行迭代。 - David
这段代码并不对字典进行排序,但是它会按照排序后的形式打印出字典的键/值。 - S.S.D
@S.S.D 不是真的。正如我的回答所说,不存在所谓的“排序字典”。表达式 Array(d).sorted... 给出了字典的排序导数——一个数组。print 只是证明了这一点。 - matt

2
在Swift 2.2中,这是有效的。
for (k,v) in (Array(d).sort {$0.1 < $1.1}) {
    print("\(k):\(v)")
}

Swift 3同样适用:

for (k,v) in (Array(yourDictionary).sorted {$0.1 < $1.1}) {
    print("\(k):\(v)")
}

1

Swift 4及以上版本的简单解决方案...

let dict = ["Museum1":8785.8971799638,
            "Museum2":34420.9643422388,
            "Museum3":826.467789130732,
            "Museum4":304120.342151219]

let dictSortByValue = dict.sorted(by: {$0.value < $1.value} )

for item in dictSortByValue {
   print("\(item.key) \(item.value) ")
}

// Museum3 826.467789130732 
// Museum1 8785.8971799638 
// Museum2 34420.9643422388 
// Museum4 304120.342151219 

显然在 Swift 4 中,您可以对字典进行排序,无需转换为数组。

1
排序函数返回的是一个元组数组,而不是已排序的字典。 - Daniel
是的,你说得对,返回值是一个元组数组,但无论如何它都很有用。我有一个使用案例,其中我使用字典从数据流中查找唯一键,并存储该键的最低值。稍后,我按值对字典进行排序,以获得一个漂亮的排序列表。使用字典查找值比使用数组更快。 - Hardy_Germany

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接