2009-11-03 34 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