2009-11-03 54 views
0

目标是生成一个长度为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); 

回答

1

您应该创建一个新的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); 
+0

工作得很好,谢谢! – 2009-11-05 07:04:39

0

您每次通过循环将相同的对象添加到您的数组中,并随时覆盖它。你刚才提到:

我想过从算法到每个字符串宣布26个不同的NSString的和分配每个 结果...

这的确是你需要做什么。将randomString的初始化移入循环将解决您的问题(在每个循环迭代中获取新的NSMutableString,而不是使用单个对象)。的randomString定义更改为一个简单的类型定义:

NSMutableString *randomString; 

,然后在外环,加入这一行:

randomString = [NSMutableString stringWithCapacity:strLength]; 

你不应该需要更改任何代码的其余部分。

2

这是我会怎么做:

#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 
+0

为了更快的性能,使用'字符*的字母表,并洗牌* *。然后使用'char *'构建一个'NSString'' – 2009-11-03 23:37:17

+2

这是很多索引到要混洗的字符串等等。我认为在NSString上创建一个类别方法对于需求来说有点重量级。这是写一个纯C函数的好时机,使用一个(静态)char *来保存源字符串,另一个写入,然后创建并返回一个NSString(+ stringWithUTF8String :)与null-终止随机C字符串。快速简单,并最小化Objective-C调用某些不需要它的东西来启动。 – 2009-11-03 23:44:30

+0

感谢您的不同策略。很有帮助。 – 2009-11-05 07:05:31