按值排序字典键,然后按键排序

Chr*_*nat 5 swift

我想迭代字典的键,首先按值(降序)排序,然后按键(升序)排序
let dict = ["foo" : 1, "bar" : 1, "baz" : 2, "qux" : 2]

迭代的顺序应该是:
["baz", "qux", "bar", "foo"]

我想打印:

baz 2
qux 2
bar 1
foo 1
Run Code Online (Sandbox Code Playgroud)

Leo*_*bus 8

Xcode 8 beta 6•Swift 3•Swift 4

extension Dictionary where Value: Comparable {
    var valueKeySorted: [(Key, Value)] {
        return sorted{ if $0.value != $1.value { return $0.value > $1.value } else { return String(describing: $0.key) < String(describing: $1.key) } }
    }
}

let dict = ["foo" : 1, "bar" : 1, "baz" : 2, "qux" : 2]

let keyValueArray = dict.valueKeySorted

print(keyValueArray)   // "[("baz", 2), ("qux", 2), ("bar", 1), ("foo", 1)]"

for (key, value) in keyValueArray {
    print(key, value)
}
Run Code Online (Sandbox Code Playgroud)

Xcode 2.x

let keyValueArray = dict.sort{ $0.0 < $1.0 }.sort{ $0.1 > $1.1}
print(keyValueArray)  // [(.0 "baz", .1 2), (.0 "qux", .1 2), (.0 "bar", .1 1), (.0 "foo", .1 1)]
Run Code Online (Sandbox Code Playgroud)

您还可以创建字典值可比较的扩展名:

extension Dictionary where Value: Comparable {
    var valueKeySorted: [(Key, Value)] {
        return sort{ $0.1 > $1.1 }.sort{ String($0.0) < String($1.0) }
    }
    // or sorting as suggested by Just Another Coder without using map
    var valueKeySorted2: [(Key, Value)] {
        return sort{ if $0.1 != $1.1 { return $0.1 > $1.1 } else { return String($0.0) < String($1.0) } }
    }


}
Run Code Online (Sandbox Code Playgroud)

用法:

let dict = ["foo" : 1, "bar" : 1, "baz" : 2, "qux" : 2]

let keyValueArray = dict.valueKeySorted

print(keyValueArray)   // "[("baz", 2), ("qux", 2), ("bar", 1), ("foo", 1)]"
Run Code Online (Sandbox Code Playgroud)

如果你想迭代keyValueArray的元组

for (key, value) in keyValueArray {
    print(key, value)
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很棒的单线. (2认同)