алгоритм добавления случайно сгенерированных NSStrings в NSMutableArray

StackOverflow https://stackoverflow.com/questions/1670753

Вопрос

Цель состоит в том, чтобы сгенерировать NSString длиной в символы и присвоить каждой строке массив.Я зацикливаюсь на том, что мне нужно сделать с моим алгоритмом, чтобы получить правильный результат.Вот образец.Результатом, который я получаю, является одна и та же случайно сгенерированная строка, добавленная в мой массив 26 раз вместо 26 добавленных РАЗНЫХ строк.

Я думал об объявлении 26 различных NSStrings и присвоении каждого результата алгоритма каждой строке, но это кажется неэффективным.Спасибо за помощь.

NSMutableString *string = @"expert";
NSUInteger strLength = [string length];
NSString *letterToAdd;
NSString *finishedWord;
NSMutableString *randomString = [NSMutableString stringWithCapacity: strLength];
NSMutableArray *randomArray = [[NSMutableArray alloc] init];

NSArray *charArray = [[NSArray alloc] initWithObjects: @"a", @"b", @"c", @"d", 
                         @"e", @"f", @"g", @"h", @"i", @"j", @"k", @"l", @"m", 
                         @"o", @"p", @"q", @"r", @"s", @"t", @"u", @"v", @"w", 
                         @"x", @"y", @"z", nil];

for (int a = 0; a < 26; a++) {
  for (int i = 0; i < strLength; i++) {

    letterToAdd = [charArray objectAtIndex: arc4random() % [charArray count]];
    if([randomString length] < strLength) {
      [randomString insertString: letterToAdd atIndex: i];
    }

    finishedWord = randomString;
  }

  [randomArray addObject: finishedWord];   
}

NSLog(@"Random Array count %i, contents: %@", [randomArray count], randomArray);
Это было полезно?

Решение

Вам следует каждый раз создавать новую случайную строку:

NSMutableString *string = @"expert";
NSUInteger strLength = [string length];
NSString *letterToAdd;
NSString *finishedWord;
//NSMutableString *randomString = [NSMutableString stringWithCapacity: strLength];
NSMutableArray *randomArray = [[NSMutableArray alloc] init];

NSArray *charArray = [[NSArray alloc] initWithObjects: @"a", @"b", @"c", @"d", @"e", @"f",
                      @"g", @"h", @"i", @"j", @"k", @"l", @"m", @"o", @"p", @"q", @"r", @"s",
                      @"t", @"u", @"v", @"w", @"x", @"y", @"z", nil];

for (int a = 0; a < 26; a++) {
    NSMutableString *randomString = [NSMutableString stringWithCapacity: strLength];

    for (int i = 0; i < strLength; i++) {

            letterToAdd = [charArray objectAtIndex: arc4random() % [charArray count]];
                //if([randomString length] < strLength) {
                    [randomString insertString: letterToAdd atIndex: i];
                //}

        //finishedWord = randomString;
    }

    //[randomArray addObject: finishedWord];
    [randomArray addObject: randomString];
}

NSLog(@"Random Array count %i, contents: %@", [randomArray count], randomArray);

Другие советы

Вот как бы я это сделал:

#import "NSString+Shuffle.h"
NSString * string = @"expert";
NSUInteger strLength = [string length];
NSString * alphabet = @"abcdefghijklmnopqrstuvwxyz";
NSMutableSet * randomWords = [NSMutableSet set];

while ([randomWords count] < 26) {
  NSString * newWord = [alphabet shuffledString];
  newWord = [newWord substringToIndex:strLength];
  [randomArray addObject:newWord];
}
NSLog(@"Random set count %d, contents: %@", [randomWords count], randomWords);

Затем вам понадобится категория NSString что определяет shuffledString.Этот метод просто возьмет символы в строке и переупорядочит их случайным образом.Достойные алгоритмы перемешивания можно легко найти в Google.

Надеюсь, вы получили общее представление о том, как это работает.Единственное изменение, которое я сделал, — это использование NSSet вместо NSArray и условия выполнения цикла.Это исключает (незначительную) возможность дублирования случайных слов.

Редактировать:поскольку я чувствую себя щедрым, вот базовая информация shuffledString выполнение:

//NSString+Shuffle.h
@interface NSString (ShuffleAdditions)

- (NSString *) shuffledString;

@end

//NSString+Shuffle.m
#import "NSString+Shuffle.h"

@implementation NSString (ShuffleAdditions)

- (NSString *) shuffledString {
  NSMutableString * shuffled = [self mutableCopy];
  NSUInteger length = [shuffled length];
  for (int i = 0; i < (4*length); ++i) {
    NSString * randomChar = [shuffled subStringWithRange:NSMakeRange(arc4random() % (length-1), 1)];
    [shuffled appendString:randomChar];
  }
  return [shuffled autorelease];
}
@end

Вы добавляете один и тот же объект в свой массив каждый раз в цикле и перезаписываете его по ходу выполнения.Вы упомянули:

Я думал об объявлении 26 различных NSStrings и присвоении каждой результата алгоритма каждой строке...

И это действительно именно то, что вам нужно сделать.Перемещение инициализации randomString включение в цикл решит вашу проблему (получение нового NSMutableString на каждой итерации цикла, а не с использованием одного объекта).Измените определение randomString к простому определению типа:

NSMutableString *randomString;

а затем во внешнем цикле добавьте эту строку:

randomString = [NSMutableString stringWithCapacity:strLength];

Вам не нужно будет изменять что-либо в остальной части вашего кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top