алгоритм добавления случайно сгенерированных NSStrings в NSMutableArray
-
13-09-2019 - |
Вопрос
Цель состоит в том, чтобы сгенерировать 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];
Вам не нужно будет изменять что-либо в остальной части вашего кода.