Каков наиболее эффективный способ подсчета количества слов в NSString без использования регулярных выражений? - PullRequest
1 голос
/ 20 октября 2010

Я немного новичок в Objective C и мне было интересно, есть ли лучший способ считать слова в строке.

е:

NSString *str = @"this is a string";

// return should be 4 words ..

Как я теперь это делаю, разбивая строку на массив символов пробела ('') и считая массив.

Любой совет будет оценен! Спасибо!! :)

EDIT: Для тех из вас, кто пришел сюда в поисках ответа; Я нашел похожий пост с отличным ответом.

Как считать слова в текстовой строке?

Ответы [ 7 ]

6 голосов
/ 20 октября 2010

Есть два способа, которые не включают сбор массива слов и должны быть умнее, чем просто разбивать пробелы:

Я бы использовал один из них, даже если бы я хотел собрать или иным образом использовать слова.

5 голосов
/ 20 октября 2010

В этой ситуации я бы использовал NSScanner так:

NSString *str = @"this is a string";
NSScanner *scanner = [NSScanner scannerWithString:str];
NSCharacterSet *whiteSpace = [NSCharacterSet whitespaceAndNewlineCharacterSet];
NSCharacterSet *nonWhitespace = [whiteSpace invertedSet];
int wordcount = 0;

while(![scanner isAtEnd])
{
    [scanner scanUpToCharactersFromSet:nonWhitespace intoString:nil];
    [scanner scanUpToCharactersFromSet:whitespace intoString:nil];
    wordcount++;
}

Это создает только два дополнительных объекта, независимо от длины строки.

5 голосов
/ 20 октября 2010

Если вы не собираетесь делать это сотни раз в секунду, я бы выбрал удобочитаемое решение, например, следующий псевдокод:

def count (str):
    lastchar = " "
    count = 0
    for char as every character in string:
        if char is not whitespace and lastchar is whitespace:
            count = count + 1
        lastchar = char
    return count

Создание целого массива других строк кажется излишней тратой, чтобы вы могли их посчитать и выбросить.

И если по какой-то причине это становится проблемой, вы можете просто заменить тело функции более быстрой версией. Однако сначала убедитесь, что является проблемой. Оптимизация кода, достаточно быстрая, уже потрачена впустую.

5 голосов
/ 20 октября 2010

Вы уверены, что у вас есть узкое место в этой части кода?Если нет (что вполне вероятно), то разделение на пространства кажется мне вполне приемлемым.Вместо этого вы можете создать строку C и сосчитать пробелы, но во многих случаях такая «оптимизированная» версия на самом деле медленнее, чем оригинальная.То есть, предполагая, что ваш текущий код выглядит следующим образом:

NSUInteger wordCount = [[someString componentsSeparatedByString:@" "] count];

Это не совсем правильно (см. @"___", где подчеркивание - пробел), но, возможно, вы действительно используете регулярное выражение и разбиваете на \s+ * * 1006

1 голос
/ 20 февраля 2014

Этот код будет подсчитывать количество слов (то есть непустых подстрок), содержащихся в строке, которые разделены любым количеством пробел или перенос строки символов:

NSUInteger wordCount = 0;

for (NSString* word in [someString
    componentsSeparatedByCharactersInSet:
    [NSMutableCharacterSet characterSetWithCharactersInString:@" \n"]]) {

    if (![word  isEqual: @""]) {
        wordCount++;
    }

}

Это небольшое улучшение в ответе zoul без повторения регулярных выражений.

1 голос
/ 20 октября 2010

для хранения строки в массиве

NSArray *yourArray = [str componentsSeparatedByString:@" "];

Обновление:

и не считая слов, которые вы можете использовать

[yourArray count]
0 голосов
/ 23 сентября 2015

Одно линейное точное решение:

return [[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]].count;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...