Разделить строку при изменении регистра - PullRequest
2 голосов
/ 30 марта 2011

Учитывая строку, скажем "acbXyzKlm", я хочу разделить ее на abc, Xyz, Klm.Один наивный способ сделать это состоит в том, чтобы пройти через строку и обнаружить изменение дела для разделения.Мне было интересно, если есть лучший алгоритм для этого.

Ответы [ 2 ]

5 голосов
/ 30 марта 2011

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

Ваш алгоритм делает именно это, следовательно, он оптимален в вычислительном отношении. Любой «лучший» алгоритм был бы вариантом и / или микрооптимизацией этого, с той же общей сложностью.

0 голосов
/ 20 октября 2011

Мне это нужно было сегодня, поэтому я реализовал его с категорией:

@interface NSString (Extensions)

- (NSString*) spacify;

@end

@implementation NSString (Extensions)

- (NSString*) spacify
{

    // ignore irrelevant strings
    if (self.length < 1)
        return self;

    NSMutableString* result = [NSMutableString stringWithString:self];

    // create a range starting after the first character
    NSRange range;
    range.location = 1;
    range.length = [self length] - 1;

    // match any uppercase character
    NSRegularExpression* r = [NSRegularExpression regularExpressionWithPattern: @"[A-Z]" 
                                                                       options: 0 
                                                                         error: nil];

    // replace matches with the match preceded by a space
    [r replaceMatchesInString: result 
                      options: 0 
                        range: range 
                 withTemplate: @" $0"];
    return [NSString stringWithString:result];
}

@end

Тесты:

@implementation NSStringExtensionsTest

- (void) testSpacify
{
    NSString* target = @"ThisIsAStringX";
    NSString* expected = @"This Is A String X";
    NSString* actual = [target spacify];
    STAssertEqualObjects(expected, actual, nil);
}

- (void) testSpacify_NoMatches_DoesNothing
{
    NSString* target = @"thisisstring";
    NSString* actual = [target spacify];
    STAssertEqualObjects(target, actual, nil);
}

- (void) testSpacify_EmptyString_DoesNothing
{
    NSString* target = @"";
    NSString* actual = [target spacify];
    STAssertEqualObjects(target, actual, nil);
}

- (void) testSpacify_InvalidLength_DoesNothing
{
    NSString* target = @"A";
    NSString* actual = [target spacify];
    STAssertEqualObjects(target, actual, nil);
}

@end
...