2015-11-10 2 views
0

Я выполняю ряд строк, которые я получаю с моего сервера. Мне нужно знать, какие из 25 строк имеют наибольшее значение. Мне было интересно, что самый эффективный/быстрый способ сделать это может меня. Я мог бы получить от 1000 до 10000 строк. Я думал о подходе, в котором я делаю карту строки для появления. Затем создайте список вхождений. Сортируйте этот список. Затем повторите по карте (key,value) с на карте и найдите те, которые соответствуют самым высоким номерам. Звучит немного запутанно, поэтому я подумал, что попрошу посмотреть, есть ли у кого лучший подход. Все, что я нашел в Интернете, похоже на то, о чем я думал.Поиск 25 наиболее встречающихся строк

+1

вы можете использовать NSCountedSet держать бирку. Вам все равно придется перебирать набор, чтобы создать список топ-25. – Paulw11

ответ

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)] 
+0

. Вы создали подсчитанный набор, используя словарь – Paulw11

+1

Да! Так мы сделали это до Какао. :) – Grimxn

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) }

+0

Привет, как я могу сортировать его со встроенными методами? Я не могу назвать 'set.sort()' – TurtleFan

+0

Привет, я обновил свой пост. – Tobonaut

+0

'NSCountedSet' не имеет метода' -sort: ' –