Swift:按自然顺序对数组进行排序

3

我这里有一个带有顺序的字典:

var pickerData = [
    "en":"abc",
    "jp":"xyz",
    "fr":"gya",
    "zh-CN":"uio"]

但是当我使用println()打印pickerData.keys.array时,顺序并不像上面那样。我想按照上述顺序对pickerData.keys.array进行排序,这可能吗?

4个回答

2
字典不是有序数据结构,而数组是。因此,从无序数据结构中获取键将导致无序结果。您需要创建自己的OrderedDictionary,这并不难做到。
这里有一个项目,其中包含有序字典的示例:https://github.com/lithium3141/SwiftDataStructures
如果您想了解详细信息,这里有一篇文章解释整个过程:http://timekl.com/blog/2014/06/02/learning-swift-ordered-dictionaries/

1

这是如何对键数组进行排序的:

let sortedKeys = sorted(pickerData.keys.array, { 
    (s1: String, s2: String) -> Bool in
    return s1 < s2
})

只需更改返回语句即可将排序逻辑更改为符合您要求的逻辑。


这不起作用。我只需要像我上面写的那样自然排序。按照定义的字典顺序排序。 - TomSawyer
字典不保证任何顺序。你应该考虑使用数组或者创建自己的类来保持引用的排序。你说的“不工作”是什么意思,能解释一下吗?我在 playground 中尝试了一下,它是可以工作的。 - Greg
@TomSawyer:字典没有顺序 - Martin R
还有更多的解决方案。您可以在数组中保留只有一个值和键的字典 - 数组具有顺序。您还可以创建一个新类,在该类中,您拥有与问题中相同的字典和仅保留键的数组,这些键将默认按顺序排列。 - Greg
@Greg,这就是我在上面回答中提供的解决方案。使用我回答中的示例创建一个有序字典,性能比尝试创建元组数组要好得多。而且,使用元组数组会失去按键引用项目的能力。 - wottle
显示剩余2条评论

1
为了获得一个排序后的关键字数组版本,需要考虑到它是一个不可变数组,你需要:
  • 将其复制到一个可变变量中
  • 使用sort方法进行原地排序
这是代码:
var array = pickerData.keys.array as [String]
array.sort(<)

现在array按字母顺序排序。需要复制键数组的原因是sort是就地排序,这在不可变数组上显然不可能。

0

自从Swift 4和5以来,这变得更加容易了:

for mySortedKey in pickerData.keys.sorted() {
    [....]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接