我正在迭代从服务器获得的一些字符串。我需要知道哪两个字符串出现次数最多。我想知道最有效/最快的做法是什么。我可以获得1000到10000个字符串。我正在考虑一种方法,我将字符串映射发生。然后列出事件列表。对该列表排序。然后迭代地图中的(key,value)
并找到与那些最高数字对应的那些。听起来有点费解,以为我会问是否有人有更好的方法。我在网上发现的一切与我的想法非常相似。
答案 0 :(得分:2)
这是Cocoa CountedSet
(Apple Dev Doc)的完美用例。
let set = NSCountedSet()
set.addObject("Bob")
set.addObject("Charlotte")
...
set.addObject("Bob")
print(set.countForObject("Bob")) // prints 2
现在,您可以使用sort()
方法构建对dict进行排序。例如,请查看相关的stack overflow thread。
<强>更新强>
可能的排序方法是:
set.sort { return set.countForObject($0) < set.countForObject($1) }
答案 1 :(得分: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)]