首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用tie元素按值排序字典不应更改其顺序

使用tie元素按值排序字典不应更改其顺序
EN

Stack Overflow用户
提问于 2018-09-07 06:24:18
回答 2查看 159关注 0票数 0

我有一个字符串类型的字典: Int,它的值是

代码语言:javascript
复制
let dic = [“a”:4, “b”:3, “c”:3]

我想按值和方法对字典进行排序。

代码语言:javascript
复制
dic  = dic.sorted(by: { $0.value < $1.value })

结果

代码语言:javascript
复制
dic = [“c”:3, “b”:3, “a”:4]

它对字典进行排序,但我希望相同的值不应该排序或更改它们的顺序,例如,我希望得到这个结果。

代码语言:javascript
复制
dic = [“b”:3, “c”:3, “a”:4]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-07 07:15:51

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

如果您想要为您的游戏存储分数值(对于领导板,即)您可以使用元组

代码语言:javascript
复制
typealias Score = (username: String, score: Int)

然后,use可以创建一个元组数组,并根据需要对它们进行排序。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-09-07 07:01:57

字典是无序的。这意味着,无论您在代码中看到的是什么顺序,都不能保证保持KVP。sort调用只要求按值进行排序,因此键可以按它们想要的顺序排序。

还请注意,Swift的sorted(by:)不是稳定。这意味着,被视为平等的事物不能保证维持其秩序。

因此,如果你坚持使用Swift内置的算法,你就什么也做不了。您可以自己编写插入排序(一种稳定的排序算法)并使用它。

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

代码语言:javascript
复制
let newDict = dict.sorted(by: { $0.value == $1.value ? $0.key < $1.key : $0.value < $1.value })

显然,这将只有当你的玩家名字是按字典排序的时候才能起作用。

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

代码语言:javascript
复制
struct Player {
    let name: String
    var score: Int
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52216477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档