在
swift中是否有 – (NSArray *)keysSortedByValueUsingSelector:(SEL)比较器的模拟?
如何做这个没有投射到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排序语义.请注意,我正在使用排序,而不是排序以最小化数组复制.通过查看早期版本并将排序和将KeyType []修复为[KeyType]替换排序,可以使代码更加紧凑,
更新到Swift 2.2:
从KeyType更改为Key,将ValueType更改为Value.使用新的内置函数到Array而不是sort(Array)注意,使用sortInPlace而不是排序可以稍微改进所有这些的性能