使用 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 结构并使用Players 的数组:

struct Player 
    let name: String
    var score: Int

【讨论】:

以上是关于使用 tie 元素按值排序字典不应更改其顺序的主要内容,如果未能解决你的问题,请参考以下文章

按值然后键对字典进行排序

字典排序

如何按值和键的多个条件对嵌套字典进行排序?

c# Dictionary 字典的排序问题,请大家指点

python怎么对字典进行排序

按值对字典进行排序[重复]