一尘不染

在Swift中按值对字典排序

swift

是否有-(NSArray *)keysSortedByValueUsingSelector:(SEL)comparator的类似物?

如何在不强制转换为NSDictionary的情况下执行此操作?

我试过了,但这似乎不是一个好的解决方案。

var values = Array(dict.values)
values.sort({
    $0 > $1
    })

for number in values {
    for (key, value) in dict {
        if value == number {
            println(key + " : \(value)");
            dict.removeValueForKey(key);
            break
        }
    }
}

例:

var dict = ["cola" : 10, "fanta" : 12, "sprite" : 8]
dict.sortedKeysByValues(>) // fanta (12), cola(10), sprite(8)

阅读 336

收藏
2020-07-07

共1个答案

一尘不染

尝试:

let dict = ["a":1, "c":3, "b":2]

extension Dictionary {
    func sortedKeys(isOrderedBefore:(Key,Key) -> Bool) -> [Key] {
        return Array(self.keys).sort(isOrderedBefore)
    }

    // Slower because of a lot of lookups, but probably takes less memory (this is equivalent to Pascals answer in an generic extension)
    func sortedKeysByValue(isOrderedBefore:(Value, Value) -> Bool) -> [Key] {
        return sortedKeys {
            isOrderedBefore(self[$0]!, self[$1]!)
        }
    }

    // Faster because of no lookups, may take more memory because of duplicating contents
    func keysSortedByValue(isOrderedBefore:(Value, Value) -> Bool) -> [Key] {
        return Array(self)
            .sort() {
                let (_, lv) = $0
                let (_, rv) = $1
                return isOrderedBefore(lv, rv)
            }
            .map {
                let (k, _) = $0
                return k
            }
    }
}

dict.keysSortedByValue(<)
dict.keysSortedByValue(>)

更新:

从beta
3更新到新的数组语法和排序语义。请注意,我正在使用,sort而不是sorted在最大程度上减少数组复制。该代码可以做得更紧凑,通过查看早期版本,并取代sortsorted和固定的KeyType[][KeyType]

更新到Swift 2.2:

从变更类型KeyTypeKeyValueTypeValue。使用新的sort内置函数来Array代替sort(Array)
Note可以通过使用sortInPlace代替来稍微改善所有这些的性能。sort

2020-07-07