我有一个字符串类型的字典: 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]发布于 2018-09-07 07:15:51
这里的主要问题是字典是一个无序的集合。,因此尝试对其进行排序并不是最好的做法。
如果您想要为您的游戏存储分数值(对于领导板,即)您可以使用元组。
typealias Score = (username: String, score: Int)然后,use可以创建一个元组数组,并根据需要对它们进行排序。
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)
}发布于 2018-09-07 07:01:57
字典是无序的。这意味着,无论您在代码中看到的是什么顺序,都不能保证保持KVP。sort调用只要求按值进行排序,因此键可以按它们想要的顺序排序。
还请注意,Swift的sorted(by:)不是稳定。这意味着,被视为平等的事物不能保证维持其秩序。
因此,如果你坚持使用Swift内置的算法,你就什么也做不了。您可以自己编写插入排序(一种稳定的排序算法)并使用它。
另一种解决方案是按值排序KVP,然后按键排序:
let newDict = dict.sorted(by: { $0.value == $1.value ? $0.key < $1.key : $0.value < $1.value })显然,这将只有当你的玩家名字是按字典排序的时候才能起作用。
或者,创建一个Player结构并使用Player的数组:
struct Player {
let name: String
var score: Int
}https://stackoverflow.com/questions/52216477
复制相似问题