2015-12-03 4 views
0

Я хочу знать простой и быстрый способ определить, одинаковы ли все символы в NSString.Проверьте, что NSString содержит только один символ.

Например:

NSString *string = "aaaaaaaaa" 
=> return YES 
NSString *string = "aaaaaaabb" 
=> return NO 

Я знаю, что я могу добиться этого с помощью цикла, но мой NSString давно поэтому я предпочитаю более короткий и простой путь.

+1

Ни одно из решений, представленных в то время, когда я пишу это, будет корректно работать для символов (глифов), которые состоят из более чем одного unichar. В зависимости от вашего варианта использования это может иметь значение. – Avi

ответ

3

вы можете использовать это, заменить первый символ с нулевым и проверить длину:

-(BOOL)sameCharsInString:(NSString *)str{ 
    if ([str length] == 0) return NO; 
    return [[str stringByReplacingOccurrencesOfString:[str substringToIndex:1] withString:@""] length] == 0 ? YES : NO; 
} 
+0

Я тестировал, и это работает, хорошая идея. Спасибо ;) –

0

использовать этот цикл:

NSString *firstChar = [str substringWithRange:NSMakeRange(0, 1)]; 
for (int i = 1; i < [str length]; i++) { 
    NSString *ch = [str substringWithRange:NSMakeRange(i, 1)]; 
    if(![ch isEqualToString:firstChar]) 
    { 
     return NO; 
    } 
} 
return YES; 
+0

этот ответ правильный, но знаете ли вы другой более короткий путь? –

+0

nope. Это самое простое, о котором я мог думать. – ShahiM

1

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

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

NSScanner * scanner = [NSScanner scannerWithString:s]; 
NSString * firstChar = [s substringWithRange:[s rangeOfComposedCharacterSequenceAtIndex:0]]; 
while([scanner scanString:firstChar intoString:NULL]) continue; 

BOOL stringContainsOnlyOneCharacter = [scanner isAtEnd]; 

Regex также является хорошим инструментом для решения этой проблемы, так как «символ следует любое количество повторений этого символа» в очень просто выражается с одной задней Справочно:

// Match one of any character at the start of the string, 
// followed by any number of repetitions of that same character 
// until the end of the string. 
NSString * patt = @"^(.)\\1*$"; 
NSRegularExpression * regEx = 
      [NSRegularExpression regularExpressionWithPattern:patt 
                 options:0 
                 error:NULL]; 

NSArray * matches = [regEx matchesInString:s 
            options:0 
            range:(NSRange){0, [s length]}]; 
BOOL stringContainsOnlyOneCharacter = ([matches count] == 1); 

Оба эти параметры правильно обрабатывают многобайтовые и скомпонованные символы; версия regex также не требует явной проверки пустой строки.

Смежные вопросы