Как подсчитать количество не алфавитно-цифровых символов в объекте NSString? - PullRequest
1 голос
/ 16 ноября 2010

Я углубляюсь в разработку под iOS и все еще знакомлюсь с объектом NSString.Я нахожусь в точке, где мне нужно посчитать количество не буквенно-цифровых символов в строке.Один из подходов, который я предложил, заключался в извлечении не-буквенно-цифровых символов из строки, затем вычитании длины обрезанной строки из длины исходной строки, например, так ...

NSCharacterSet *nonalphanumericchars = [[NSCharacterSet alphanumericCharacterSet ] invertedSet];

NSString *trimmedString = [originalString stringByTrimmingCharactersInSet:nonalphanumericchars];

NSInteger numberOfNonAlphanumericChars = [originalString length] - [trimmedString length];

, но это не такза работой.Счет всегда равен нулю.Как подсчитать количество не алфавитно-цифровых символов в объекте NSString?

Большое спасибо за вашу мудрость!

Ответы [ 3 ]

6 голосов
/ 16 ноября 2010

Проблема с вашим подходом заключается в том, что вы не снимаете символы, а обрезаете их.Это означает только удаление символов с концов строки, которые соответствуют набору (ничего посередине).

Для этого вы можете перебрать строку и проверить, что каждый символ не является членом буквенно-цифрового набора.Например:

NSString* theString = // assume this exists
NSMutableCharacterSet* testCharSet = [[NSMutableCharacterSet alloc] init];
[testCharSet formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
[testCharSet formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];
NSUInteger length = [theString length];
NSUInteger totalNonAlnumCharacters = length;
for( NSUInteger i = 0; i < length; i++ ) {
  if( [testCharSet characterIsMember:[theString characterAtIndex:i]] )
    totalNonAlnumCharacters--;
}
NSLog(@"Number of non-alphanumeric characters in string: %lu", (long int)totalNonAlnumCharacters);
[testCharSet release];
2 голосов
/ 16 ноября 2010

Поскольку вы упомянули, что пытались сделать это с помощью stringByTrimmingCharactersInSet:, было бы интересно узнать, что на самом деле существует способ сделать это только с вызовами фреймворка.Заимствуя установочный код у Джейсона

NSString* theString = // assume this exists
NSMutableCharacterSet* testCharSet = [[NSMutableCharacterSet alloc] init];
[testCharSet formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
[testCharSet formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];

, вы могли бы затем обрезать цикл for примерно так:

NSArray *nonComp = [theString componentsSeparatedByCharactersInSet:testCharSet];

Это будет разбивать строку на части в каждом индексе, где он находит символиз кодировки, создавая массив из оставшихся частей.Затем вы можете использовать Key-Value Coding для суммирования свойства длины всех кусочков:

NSNumber *numberOfNonANChars = [nonComp valueForKeyPath:@"@sum.length"];

или вместо этого снова склеить кусочки и сосчитать длину:

NSUInteger nonANChars = [[nonComp componentsJoinedByString:@""] length];

Но: разделение компонентов создаст массив и строки, которые не нужны после подсчета - бессмысленное выделение памяти (то же самое касается компонентовJoinedByString :).И использование valueForKeyPath: для этого очень простого суммирования также кажется гораздо более дорогостоящим, чем просто перебор исходной строки.

Код может быть немного более объектно-ориентированным или даже менее подверженным ошибкам, но в обоих случаяхпроизводительность будет на порядок хуже, чем у кода Джейсона.Таким образом, в этом случае старый добрый цикл for превыше всего (поскольку используемые методы не предназначены для этого) функциональных возможностей фреймворка.

0 голосов
/ 16 ноября 2010
NSString *str=@"str56we90";
int count;

for(int i=0;i<[str length];i++)
{
    int str1=(int)[str characterAtIndex:i];
    NSString *temp=[NSString stringWithFormat:@"%C",str1];

    if(str1 >96 && str1 <123  || str1 >64 && str1 <91)

        count=count +1;
}

int finalResult = [str length] - count;

счет будет вашим окончательным результатом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...