3

NSArray を使用していたときは、簡単でした。

NSArray *array = ...
lastIndex = INT_MAX;
...
int randomIndex;
do {
  randomIndex = RANDOM_INT(0, [array count] - 1);
} while (randomIndex == lastIndex);
NSLog(@"%@", [array objectAtIndex:randomIndex]);
lastIndex = randomIndex;

ランダム感が欲しいので、lastIndex を追跡する必要があります。つまり、同じ要素を 2 回続けて取得したくありません。したがって、「真の」ランダム性であってはなりません。

私が知る限り、NSDictionary には -objectAtIndex: のようなものはありません。では、どうすればこれを達成できますか?

4

2 に答える 2

2

allKeys (未定義の順序) またはkeysSortedByValueUsingSelector (値でソートする場合) を使用して、キーの配列を取得できます。(lastIndex に関して) 覚えておくべきことの 1 つは、並べ替えを行っても、辞書が大きくなるにつれて、同じインデックスが別のキーと値のペアを参照するようになる可能性があることです。

これらのいずれか (特に keysSortedByValueUsingSelector) には、パフォーマンスの低下が伴います。

編集: 辞書は可変ではないため、allKeys を 1 回呼び出すだけで、そこからランダムなキーを選択できます。

于 2009-07-10T22:31:21.850 に答える
1

以下のコードを使用できます。

- (YourObjectType *)getRandomObjectFromDictionary:(NSDictionary *)dictionary
{
    NSArray *keys = dictionary.allKeys;
    return dictionary[keys[arc4random_uniform((int)keys.count)]];
}

より効率的にするためkeysに、インスタンス変数にキャッシュできます。お役に立てれば。

于 2014-04-11T20:12:28.197 に答える