0

我有一个 [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]
4

2 回答 2

2

字典是无序的。这意味着无论您在代码中看到的 KVP 的顺序如何,都不能保证得到维护。该sort调用仅表示按值排序,因此键可以按他们想要的任何顺序排列。

另请注意,Swiftsorted(by:)不稳定。这意味着被认为是平等的事物并不能保证维持它们的秩序。

因此,如果你坚持使用 Swift 的内置算法,你将无能为力。您可以自己编写一个插入排序(一种稳定的排序算法)并使用它。

另一种解决方案是按值排序 KVP,然后按键:

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

显然,这仅在您的玩家名称最初按字典顺序排列时才有效。

或者,创建一个Player结构并使用 s 数组Player

struct Player {
    let name: String
    var score: Int
}
于 2018-09-07T07:01:57.830 回答
2

这里的主要问题是字典是一个无序集合,因此尝试对其进行排序并不是最好的选择。

如果您想存储游戏的得分值(例如排行榜),您可以使用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)
}
于 2018-09-07T07:15:51.077 回答