算法将随机生成的NSString添加到NSMutableArray
目标是生成一个长度为NSString的字符并将每个字符串分配给一个数组。我遇到了我需要用我的算法来获得正确结果的问题。这是示例。我得到的结果是同样的随机生成的字符串添加到我的数组26次,而不是添加了26个不同的字符串。算法将随机生成的NSString添加到NSMutableArray
我想过宣布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);
您应该创建一个新的randomString每次:
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);
您每次通过循环将相同的对象添加到您的数组中,并随时覆盖它。你刚才提到:
我想过从算法到每个字符串宣布26个不同的NSString的和分配每个 结果...
这的确是你需要做什么。将randomString
的初始化移入循环将解决您的问题(在每个循环迭代中获取新的NSMutableString
,而不是使用单个对象)。的randomString
定义更改为一个简单的类型定义:
NSMutableString *randomString;
,然后在外环,加入这一行:
randomString = [NSMutableString stringWithCapacity:strLength];
你不应该需要更改任何代码的其余部分。
这是我会怎么做:
#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
为了更快的性能,使用'字符*的字母表,并洗牌* *。然后使用'char *'构建一个'NSString'' – 2009-11-03 23:37:17
这是很多索引到要混洗的字符串等等。我认为在NSString上创建一个类别方法对于需求来说有点重量级。这是写一个纯C函数的好时机,使用一个(静态)char *来保存源字符串,另一个写入,然后创建并返回一个NSString(+ stringWithUTF8String :)与null-终止随机C字符串。快速简单,并最小化Objective-C调用某些不需要它的东西来启动。 – 2009-11-03 23:44:30
感谢您的不同策略。很有帮助。 – 2009-11-05 07:05:31
工作得很好,谢谢! – 2009-11-05 07:04:39