2012-01-25 3 views
3

기존 NSString 또는 NSMutableString 문자의 순서를 변경하는 기존 방법을 아는 사람이 있습니까? 어쨌든 마음에있는 해결 방법이 있지만 기존 방법이 있으면 좋을 것입니다.NSString의 순서를 뒤지는 빠른 방법?

예를 들어 @ "HORSE"라는 문자열, @ "ORSEH", @ "SORHE", @ "ROHES"등을 반환하는 메소드가 있습니까?
.H 파일 :

@interface NSString (Scrambling) 

+ (NSString *)scrambleString:(NSString *)toScramble; 

@end 

하는 .m 파일 :

답변

5

이 코드를 고려

@implementation NSString (Scrambling) 

+ (NSString *)scrambleString:(NSString *)toScramble { 
    for (int i = 0; i < [toScramble length] * 15; i ++) { 
     int pos = arc4random() % [toScramble length]; 
     int pos2 = arc4random() % ([toScramble length] - 1); 
     char ch = [toScramble characterAtIndex:pos]; 
     NSString *before = [toScramble substringToIndex:pos]; 
     NSString *after = [toScramble substringFromIndex:pos + 1]; 
     NSString *temp = [before stringByAppendingString:after]; 
     before = [temp substringToIndex:pos2]; 
     after = [temp substringFromIndex:pos2]; 
     toScramble = [before stringByAppendingFormat:@"%c%@", ch, after]; 
    } 
    return toScramble; 
} 

@end 

아니 가장 아름다운 코드 또는 실행하지만, 일을 가져옵니다. 아마도 (const char *) 방법이 있지만,이 나를 위해 잘 작동합니다. 빠른 테스트는 내 Mac에서 실행시 0.001021 초의 길이를 보여줍니다.

사용법 : 다른 언어/의사

+0

10.7 또는 iOS 4.3 이상에서 코드를 실행하는 경우 arc4random_uniform (maxIntIndex)이 더 나은 난수 생성 프로그램입니다. 더 오래된 것을 지원해야하는 경우에도 arc4random()은 여전히 ​​좋습니다. –

+1

아, 10.5 용으로 컴파일 할 때 "제안 사항"메뉴에 나타나지 않았습니다. 알아 둘만한. –

+0

@ HiGuy'CouleeApps 님, 안녕하십니까? ** 시맨틱 문제 : 클래스 메소드 '+ scrambleString :'을 찾을 수 없습니다 (반환 유형의 기본값은 'id') ** 내가 어떻게 고칠 수 있는지 생각해? 헤더와 구현 파일에 넣었습니다 –

3

당신은 Fisher-Yates Shuffle의 Durstenfeld의 변화를 사용할 수 있습니다에서 적응

NSString *scrambled = [NSString scrambleString:otherString]; 

코드입니다.

매우 긴 문자열의 경우 unichars를 unichar 버퍼에 복사 한 다음 c 또는 C++ 접근 방식을 사용하여 문자를 스왑하여 많은 CPU 시간과 할당을 절약 할 수 있습니다. UTF8String은 취할 버퍼가 아니며이를 변경해야합니다. 그런 다음 셔플 링 된 버퍼에서 새로운 NSString을 생성 (또는 설정)하십시오.

Fisher Yates algo 및 C 및 C++ 구현에 대한 추가 정보 can be found here.