我正在迭代从服务器获得的一些字符串。我需要知道哪25个字符串出现的次数最多。我想知道最有效/最快的方法是什么。我可以得到1000到10000个字符串。我在想一种方法,我制作一个字符串到事件的映射。然后列出发生的事件。对列表进行排序。然后在映射中的(key,value)
s上迭代,找到与这些最高数字相对应的数字。听起来有点复杂,所以我想看看是否有人有更好的方法。我在网上发现的一切都和我当时的想法非常相似。
这是Cocoa的CountedSet
(Apple开发文档)的完美用例。
swift.com 黑客提供的示例
let set = NSCountedSet()
set.addObject("Bob")
set.addObject("Charlotte")
...
set.addObject("Bob")
print(set.countForObject("Bob")) // prints 2
现在,您可以使用内置的sort()
方法对dict进行排序。例如,请看一下这个相关的堆栈溢出线程。
更新
一种可能的排序方法是:
set.sort { return set.countForObject($0) < set.countForObject($1) }
这是一种非常常见的模式。在文本处理语言AWK中,它非常常见,以至于实现非常简单:stringCount[newString]++
。
在Swift中,我们需要更明确一点——使用纯Swift的Playground代码:
var stringCount: [String: Int] = [:] // i.e. a Dictionary keyed by the strings, whose value is the occurrence count
func addString(newString: String) {
if let oldCount = stringCount[newString] { // We have seen this string before
stringCount[newString] = oldCount + 1
} else { // It's the first time we've seen this one
stringCount[newString] = 1
}
}
addString("Grimxn")
addString("TurtleFan")
addString("Grimxn")
addString("Grimxn")
addString("TurtleFan")
addString("Stack Overflow")
stringCount // ["Grimxn": 3, "TurtleFan": 2, "Stack Overflow": 1]
或者,正如@Paulw11所指出的,你可以使用Cocoa的NSCountedSet
:
var stringCount2 = NSCountedSet()
stringCount2.addObject("Grimxn")
stringCount2.addObject("TurtleFan")
stringCount2.addObject("Grimxn")
stringCount2.addObject("Grimxn")
stringCount2.addObject("TurtleFan")
stringCount2.addObject("Stack Overflow")
let counts = stringCount2.map( { return ($0, stringCount2.countForObject($0)) } )
counts // [(.0 "TurtleFan", .1 2), (.0 "Stack Overflow", .1 1), (.0 "Grimxn", .1 3)]