找到25个最常出现的字符串

时间:2015-11-10 08:33:42

标签: ios swift sorting

我正在迭代从服务器获得的一些字符串。我需要知道哪两个字符串出现次数最多。我想知道最有效/最快的做法是什么。我可以获得1000到10000个字符串。我正在考虑一种方法,我将字符串映射发生。然后列出事件列表。对该列表排序。然后迭代地图中的(key,value)并找到与那些最高数字对应的那些。听起来有点费解,以为我会问是否有人有更好的方法。我在网上发现的一切与我的想法非常相似。

2 个答案:

答案 0 :(得分:2)

这是Cocoa CountedSetApple Dev Doc)的完美用例。

hackingwithswift.com

提供的示例
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)]