Как исключить ранее случайно выбранные NSArrays в цикле - PullRequest
1 голос
/ 22 февраля 2012

Я новичок в Objective-C и пытаюсь создать простое приложение в стиле словаря для личного пользования.Прямо сейчас я пытаюсь создать цикл, который печатает случайно выбранные NSArray s, которые были добавлены к NSDictionary.Я хотел бы распечатать каждый массив только один раз.Вот код, с которым я работаю:

NSArray *catList = [NSArray arrayWithObjects:@"Lion", @"Snow Leopard", @"Cheetah", nil];
NSArray *dogList = [NSArray arrayWithObjects:@"Dachshund", @"Pitt Bull", @"Pug", nil]; 
...
NSMutableDictionary *wordDictionary = [[NSMutableDictionary alloc] init];
[wordDictionary setObject: catList forKey:@"Cats"];
[wordDictionary setObject: dogList forKey:@"Dogs"]; 
...
NSInteger keyCount = [[wordDictionary allKeys] count];
NSInteger randomKeyIndex = arc4random() % keyCount;

int i = keyCount;

for (i=i; i>0; i--) {
    NSString *randomKey = [[wordDictionary allKeys] objectAtIndex:randomKeyIndex];
    NSMutableArray *randomlySelectedArray = [wordDictionary objectForKey:randomKey];
    NSLog(@"%@", randomlySelectedArray);
}

Этот код печатает один и тот же массив "i" раз.Есть какие-нибудь указания, как исключить повторную печать ранее напечатанных массивов?

Мне интересно, может ли removeObjectForKey: быть полезным.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Вам просто нужно пересчитывать индекс случайного ключа каждый раз, когда вы проходите цикл, а затем, как вы предлагаете, использовать removeObjectForKey:.

Примерно так:

NSArray *catList = [NSArray arrayWithObjects:@"Lion", @"Snow Leopard", @"Cheetah", nil];
NSArray *dogList = [NSArray arrayWithObjects:@"Dachshund", @"Pitt Bull", @"Pug", nil]; 

//...

NSMutableDictionary *wordDictionary = [[NSMutableDictionary alloc] init];
[wordDictionary setObject: catList forKey:@"Cats"];
[wordDictionary setObject: dogList forKey:@"Dogs"]; 

//...

while ([wordDictionary count] > 0) {    
    NSInteger keyCount = [wordDictionary count];
    NSInteger randomKeyIndex = arc4random() % keyCount;
    NSString *randomKey = [[wordDictionary allKeys] objectAtIndex:randomKeyIndex];
    NSMutableArray *randomlySelectedArray = [wordDictionary objectForKey:randomKey];
    NSLog(@"%@", randomlySelectedArray);

    [wordDictionary removeObjectForKey: randomKey];
}
1 голос
/ 22 февраля 2012

В вашем коде вы генерируете случайное randomKeyIndex, а затем используете его, не изменяя его значение i раз в цикле. Таким образом, вы получаете i раз один и тот же массив.

NSInteger randomKeyIndex = arc4random() % keyCount;
// ...
for (i=i; i>0; i--) {
    NSString *randomKey = [[wordDictionary allKeys] objectAtIndex:randomKeyIndex];
    // ...
}

Как вы говорите, removeObjectForKey - это вариант для вас, вы можете изменить свой код на что-то вроде этого:

NSInteger keyCount = [[wordDictionary allKeys] count];

for (i=keyCount; i>0; i--) {
    NSInteger randomKeyIndex = arc4random() % keyCount;
    NSString *randomKey = [[wordDictionary allKeys] objectAtIndex:randomKeyIndex];
    NSMutableArray *randomlySelectedArray = [wordDictionary objectForKey:randomKey];
    [wordDictionary removeObjectForKey:randomKey];
    keyCount--;
    NSLog(@"%@", randomlySelectedArray);
}
...