是否有-(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)
尝试:
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]
sort
sorted
KeyType[]
[KeyType]
更新到Swift 2.2:
从变更类型KeyType来Key和ValueType到Value。使用新的sort内置函数来Array代替sort(Array) Note可以通过使用sortInPlace代替来稍微改善所有这些的性能。sort
KeyType
Key
ValueType
Value
Array
sort(Array)
sortInPlace