0

目標は、長さ NSString chars を生成し、各文字列を配列に割り当てることです。正しい結果を得るためにアルゴリズムで何をする必要があるのか​​ に行き詰まっています。これがサンプルです。得られる結果は、26 個の異なる文字列が追加されるのではなく、同じランダムに生成された文字列が配列に 26 回追加されることです。

26 の異なる NSString を宣言し、アルゴリズムからの各結果を各文字列に割り当てることを考えましたが、それは非効率的です。助けてくれてありがとう。

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);
4

3 に答える 3

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 で非常に簡単に見つけることができます。

これがどのように機能するかについての基本的な考え方を理解していただければ幸いです。私が行った唯一の変更は、NSArray の代わりに NSSet を使用することと、ループの条件が何であるかです。これにより、ランダムな単語が重複する (わずかな) 可能性がなくなります。

編集:私は寛大に感じているので、ここに基本的な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
于 2009-11-03T23:20:09.097 に答える
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);
于 2009-11-03T23:24:40.210 に答える
0

ループのたびに同じオブジェクトを配列に追加し、それを上書きします。あなたが言及した:

26 の異なる NSString を宣言し、アルゴリズムからの各結果を各文字列に割り当てることを考えました...

そして、それはまさにあなたがしなければならないことです。の初期化をrandomStringループに移動すると、問題が解決します (NSMutableString単一のオブジェクトを使用するのではなく、ループの反復ごとに新しいものを取得します)。randomStringの定義を単純な型定義に変更します。

NSMutableString *randomString;

次に、外側のループに次の行を追加します。

randomString = [NSMutableString stringWithCapacity:strLength];

コードの残りの部分を変更する必要はありません。

于 2009-11-03T23:19:30.110 に答える