在Swift中对字典进行排序

Mat*_*Car 12 sorting dictionary swift

我知道这个话题已经讨论过但是我无法解决其他答案,所以提前抱歉我的成熟!

我需要按键对这个词典进行排序

codeValueDict = ["us": "$", "it": "€", "fr": "€"]
Run Code Online (Sandbox Code Playgroud)

所以我需要一本这样的字典

sortedDict = ["fr": "€", "it": "€", "us": "$"]
Run Code Online (Sandbox Code Playgroud)

但我做不到.

我试过这个

let sortedKeysAndValues = sorted(dictionary) { $0.0 < $1.0 }
Run Code Online (Sandbox Code Playgroud)

但是在我需要从这个字典(键和值)创建两个数组之后,使用该解决方案

codesArray = sortedKeysAndValues.keys.array
Run Code Online (Sandbox Code Playgroud)

给我错误'[(String,String)]'没有名为'keys'的成员,因为该解决方案不会返回完全字典.

所以我试了另一个解决方案

    let prova = codiceNomeDict as NSDictionary
    for (k,v) in (Array(codiceNomeDict).sorted {$0.1 < $1.1}) {
        let value = "[\"\(k)\": \"\(v)\"]"
        println(value)
    }
Run Code Online (Sandbox Code Playgroud)

哪个有效,但后来我不知道如何创建一个新的价值字典s.

什么是最好的解决方案?如何使其工作?

Duy*_*Hoa 19

sorted上面函数的输出是一个数组.所以你不能像字典一样得到键和值.但是您可以使用map函数来检索那些排序的键和值

返回一个包含source{dependent} 的已排序元素的Array .排序算法不稳定(可以改变isOrderedBefore不建立顺序的元素的相对顺序).

let codeValueDict = ["us": "$", "it": "€", "fr": "€"]

let sortedArray = sorted(codeValueDict, {$0.0 < $1.0})
print(sortedArray)

let keys = sortedArray.map {return $0.0 }
print(keys)

let values = sortedArray.map {return $0.1 }
print(values)
Run Code Online (Sandbox Code Playgroud)

  • 只是注意,在斯威夫特2,分类是现在排序,现在旧的排序是sortInPlace,无一不是在阵列本身上被称为(他们以前全局函数)http://stackoverflow.com/questions/32738793/sorted -function合迅速-2- (2认同)

Rob*_*ier 6

字典不是订购的.如果你想按顺序枚举它们,你可以使用@ HoaParis的解决方案(这是我的偏好),或者也可以

for (k,v) in sorted(codiceNomeDict, {$0.1 < $1.1}) { ... }
Run Code Online (Sandbox Code Playgroud)

这比你之前做的好一点,因为它不会生成临时数组.

但是如果你真的想要"一个将一个值映射到另一个值并按其键排序"的集合,那么你需要为此创建一些其他数据结构.所以,让我们这样做.这是一个很好的学习经历.

这个版本只是实现SequenceType并提供了一个get/set下标,这是你通常想要的大部分内容.使其成为一个完整的CollectionType是一个有点疼痛,我认为,既然startIndexendIndexHAE是O(1).可能; 比我今天早上要做的还要多.

注意主要的补充Key: Comparable.这就是为什么Dictionary 不能订购.没有承诺你可以对他们的钥匙进行排序.通过添加该要求,我们可以.

struct SortedDictionary<Key: Hashable, Value where Key: Comparable>: SequenceType {
    private var dict: Dictionary<Key, Value>
    init(_ dict: Dictionary<Key, Value>) {
        self.dict = dict
    }
    func generate() -> GeneratorOf<(Key, Value)> {
        let values = Array(zip(self.dict.keys, self.dict.values))
            .sorted {$0.0 < $1.0 }
        return GeneratorOf(values.generate())
    }
    subscript(key: Key) -> Value? {
        get        { return self.dict[key] }
        set(value) { self.dict[key] = value }
    }
}

var codeValueDict = ["us": "$", "it": "€", "fr": "€"]
var sortedDict = SortedDictionary(codeValueDict)
for (k, v) in sortedDict {
    println("\(k) => \(v)")
}
sortedDict["us"]
sortedDict["ab"] = "!"
sortedDict
Run Code Online (Sandbox Code Playgroud)

SortedDictionary你已经拥有的时候为什么要打扰sorted()?好吧,通常我不会.但它确实提供了抽象的机会.您可以在创建对象时控制排序顺序,而不是在对象枚举时控制排序顺序.你可能会缓存排序顺序(虽然我怀疑在大多数情况下会伤害而不是帮助).

但我建议sorted一般使用.