swift中是否有使用 Select 器:(SEL)比较器的-(NSArray*)键SortedByValue模拟?

如何在不使用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)

推荐答案

try :

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)注使用sortInPlace而不是sort可以稍微改善所有这些性能

Swift相关问答推荐

解析SON数据的API调用有什么问题?

Swift 5.10:无法从非隔离的deinit访问属性*,这是Swift 6中的错误''''

更改正在进行的异步任务的完成(SWIFT并发)(&q;)?

NSWindow中以编程方式创建的TextField快捷方式与SwiftUI

在Xcode SWIFT中运行用Ionic编写的函数

在Swift中,将秒设置为0也等于将1添加到分钟

macOS SwiftUI: 如何触发删除一个项目?

DispatchQueue.main.asyncAfter 等同于 Swift 中的 struct 化并发?

Swiftui 无法从核心数据中获取数据

从文字创建数组时的 Swift 宏

自定义 DispatchQueue 服务质量

用户输入以更改通过点击生成的形状大小

使用协议捕获 SwiftUI 视图

我如何从 UIAlertController 导航到新屏幕(swiftUI)

Vapor, fluent 使用 PostgreSQL 保存/创建复杂模型

Swift中的分段错误

在swift 3中将文件保存在文档目录中?

Type 应该采用什么协议来让泛型函数将任何数字类型作为 Swift 中的参数?

使用 DispatchTime.now() + float 延迟?

在 Swift 中指定 UITextField 的边框半径