Я выполняю ряд строк, которые я получаю с моего сервера. Мне нужно знать, какие из 25 строк имеют наибольшее значение. Мне было интересно, что самый эффективный/быстрый способ сделать это может меня. Я мог бы получить от 1000 до 10000 строк. Я думал о подходе, в котором я делаю карту строки для появления. Затем создайте список вхождений. Сортируйте этот список. Затем повторите по карте (key,value)
с на карте и найдите те, которые соответствуют самым высоким номерам. Звучит немного запутанно, поэтому я подумал, что попрошу посмотреть, есть ли у кого лучший подход. Все, что я нашел в Интернете, похоже на то, о чем я думал.Поиск 25 наиболее встречающихся строк
0
A
ответ
1
Это довольно распространенный шаблон. В AWK, языке обработки текстов, было так распространено, что реализация была абсурдно простой: stringCount[newString]++
.
В Swift, мы должны быть немного более четко - площадка кода с использованием чистого Swift:
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 указывает, вы могли бы использовать Какао 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)]
2
Это идеальный вариант использования для Cocoa CountedSet
(Apple Dev Doc).
Пример обеспечивается hackingwithswift.com
let set = NSCountedSet()
set.addObject("Bob")
set.addObject("Charlotte")
...
set.addObject("Bob")
print(set.countForObject("Bob")) // prints 2
Теперь вы можете сортировать Dict с сборкой в sort()
методами. Например, посмотрите на это связанное stack overflow thread.
Update
Возможный способ сортировки есть:
set.sort { return set.countForObject($0) < set.countForObject($1) }
вы можете использовать NSCountedSet держать бирку. Вам все равно придется перебирать набор, чтобы создать список топ-25. – Paulw11