Быстрый способ перемешать порядок NSString? - PullRequest
3 голосов
/ 25 января 2012

Кто-нибудь знает существующий способ изменить порядок существующих символов NSString или NSMutableString?В любом случае, я имею в виду обходной путь, но было бы замечательно, если бы существовал метод для него.

Например, с учетом строки @ "HORSE", метод, который возвращает @ "ORSEH", @ "SORHE ", @" ROHES "и т. Д.

Ответы [ 2 ]

5 голосов
/ 26 января 2012

Рассмотрим этот код:
.h Файл:

@interface NSString (Scrambling)

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

@end

.m Файл:

@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 *) способ сделать это, но это прекрасно работает для меня.Быстрый тест показывает 0,001021 секунды для выполнения на моем Mac.

Использование:

NSString *scrambled = [NSString scrambleString:otherString];

Код адаптирован из другого языка / псевдокода

3 голосов
/ 26 января 2012

Вы можете использовать вариацию Дюрстенфельда Фишера-Йейтса Shuffle .

Для очень длинной строки вы могли бы сэкономить много процессорного времени и выделения, скопировав unichars в буфер unichar, а затем выполнив преобразование с использованием подхода c или c ++ для замены символов. Обратите внимание, что UTF8String - это не буфер, который вы хотите использовать, и вы не должны изменять его. Затем создайте (или установите) новый NSString из перетасованного буфера.

Более подробную информацию о реализации алгоритма Фишера Йетеса и C и C ++ можно найти здесь .

...