Linh
Linh

Reputation: 60923

Check if NSString only contains one character repeated

I want to know a simple and fast way to determine if all characters in an NSString are the same.

For example:

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

I know that I can achieve it by using a loop but my NSString is long so I prefer a shorter and simpler way.

Upvotes: 0

Views: 904

Answers (3)

jscs
jscs

Reputation: 64002

Here are two possibilities that fail as quickly as possible and don't (explicitly) create copies of the original string, which should be advantageous since you said the string was large.

First, use NSScanner to repeatedly try to read the first character in the string. If the loop ends before the scanner has reached the end of the string, there are other characters present.

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

BOOL stringContainsOnlyOneCharacter = [scanner isAtEnd];

Regex is also a good tool for this problem, since "a character followed by any number of repetitions of that character" is in very simply expressed with a single back reference:

// 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);

Both these options correctly deal with multi-byte and composed characters; the regex version also does not require an explicit check for the empty string.

Upvotes: 1

Jiri Zachar
Jiri Zachar

Reputation: 587

you can use this, replace first character with null and check lenght:

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

Upvotes: 3

ShahiM
ShahiM

Reputation: 3268

use this loop:

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;

Upvotes: 0

Related Questions