为了账号安全,请及时绑定邮箱和手机立即绑定

在Swift中按值对字典排序

在Swift中按值对字典排序

红颜莎娜 2019-10-18 10:25:47
是否有-(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)
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

尝试:


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在最大程度上减少数组复制。该代码可以做得更紧凑,通过查看早期版本,并取代sort与sorted和固定的KeyType[]是[KeyType]


更新到Swift 2.2:


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


查看完整回答
反对 回复 2019-10-18
?
萧十郎

TA贡献1815条经验 获得超12个赞

您可能会使用如下所示的内容:


var dict = ["cola" : 10, "fanta" : 12, "sprite" : 8]


var myArr = Array(dict.keys)

var sortedKeys = sort(myArr) {

    var obj1 = dict[$0] // get ob associated w/ key 1

    var obj2 = dict[$1] // get ob associated w/ key 2

    return obj1 > obj2

}


myArr // ["fanta", "cola", "sprite"]


查看完整回答
反对 回复 2019-10-18
  • 3 回答
  • 0 关注
  • 1661 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信