使用 tie 元素按值排序字典不应更改其顺序
Posted
技术标签:
【中文标题】使用 tie 元素按值排序字典不应更改其顺序【英文标题】:Sort Dictionary by value with tie Element should not change their order 【发布时间】:2018-09-07 06:24:18 【问题描述】:我有一个 [String: Int] 类型的字典,它的值为
let dic = [“a”:4, “b”:3, “c”:3]
我想按值和使用方法对字典进行排序
dic = dic.sorted(by: $0.value < $1.value )
结果
dic = [“c”:3, “b”:3, “a”:4]
它正在对字典进行排序,但我希望不应该对相同的值进行排序或更改它们的顺序,例如,我想要这个结果
dic = [“b”:3, “c”:3, “a”:4]
【问题讨论】:
字典是键/值对的无序集合。字典中没有排序顺序。 一开始为什么要排序? 那我应该用什么来获得结果呢? 这些是我把他们放在 dic 中的球员的分数,但我必须根据他们的分数和上述标准对球员进行排序 ***.com/questions/24090016/… 【参考方案1】:这里的主要问题是dictionary is an unordered collection,因此尝试对其进行排序并不是最好的做法。
如果您想存储游戏的得分值(例如,用于排行榜),您可以使用tuples。
typealias Score = (username: String, score: Int)
然后使用可以创建一个由元组组成的数组,并以任何你想要的方式对它们进行排序。
var scores = [Score]()
// fill the scores
scores.append(("a", 4))
scores.append(("b", 3))
scores.append(("c", 3))
scores.sort
return $0.score < $1.score || ($0.score == $1.score && $0.username.localizedCaseInsensitiveCompare($1.username) == .orderedAscending)
【讨论】:
该解决方案对我有用,谢谢。你救了我的命【参考方案2】:字典是无序的。这意味着您在代码中看到的任何 KVP 顺序都不能保证得到维护。 sort
调用仅表示按值排序,因此键可以按他们想要的任何顺序排列。
还要注意 Swift 的 sorted(by:)
不是 stable。这意味着被认为是平等的事物并不能保证保持它们的顺序。
因此,如果你坚持使用 Swift 的内置算法,你将无能为力。您可以自己编写一个插入排序(一种稳定的排序算法)并使用它。
另一种解决方案是按值排序 KVP,然后按键:
let newDict = dict.sorted(by: $0.value == $1.value ? $0.key < $1.key : $0.value < $1.value )
显然,这仅在您的玩家名称最初按字典顺序排列时才有效。
或者,创建一个Player
结构并使用Player
s 的数组:
struct Player
let name: String
var score: Int
【讨论】:
以上是关于使用 tie 元素按值排序字典不应更改其顺序的主要内容,如果未能解决你的问题,请参考以下文章