NSMutableSet и NSArray сортировка, как сохранить их согласованность? - PullRequest
0 голосов
/ 21 июня 2010

Я пытаюсь сделать массив объектов в случайном, неповторяющемся порядке. Использование NSMutableSet для тяжелого подъема, как рекомендуется здесь: Как проверить повторение чисел в массиве?

Я сбрасываю их в NSArray после создания для доступа к ним, но NSArray не остается в том порядке, в котором я разместил их в NSMutableSet. Более запутанным является то, что это не соответствует.

Мой код:

NSArray *puzzleImages = [[NSArray alloc] initWithObjects:@"elephant.png", @"gorilla.png", @"lion.png", @"zebra.png", @"flamingo.png", @"hyena.png", @"seal.png", @"hippo.png", @"rhino.png", @"tiger.png", @"macaw.png", @"bear.png", nil];

NSArray *puzzleSounds = [[NSArray alloc] initWithObjects:@"elephant", @"gorilla", @"lion", @"zebra", @"flamingo", @"hyena", @"seal", @"hippo", @"rhino", @"tiger", @"macaw", @"bear", nil];

NSMutableSet *aImages1 = [NSMutableSet setWithCapacity:2];
NSMutableSet *aSounds1 = [NSMutableSet setWithCapacity:2];
NSMutableSet *aValues1 = [NSMutableSet setWithCapacity:2];
while([aImages1 count]<=1){
  int Randnum1 = arc4random() % 11;
  [aImages1 addObject:[puzzleImages objectAtIndex:Randnum1]];
  [aSounds1 addObject:[puzzleSounds objectAtIndex:Randnum1]];
  [aValues1 addObject:[NSNumber numberWithInt:Randnum1]];
  NSLog(@"image:%@, sound:%@, value:%@",[puzzleImages objectAtIndex:Randnum1],[puzzleSounds objectAtIndex:Randnum1],[NSNumber numberWithInt:Randnum1]);
} 

NSArray *arrayOfImages1 = [aImages1 allObjects];
NSLog(@"arrayOfImages1: %@",arrayOfImages1);

NSArray *arrayOfSounds1 = [aSounds1 allObjects];
NSLog(@"arrayOfSounds1: %@",arrayOfSounds1);

NSArray *arrayOfValues1 = [aValues1 allObjects];
NSLog(@"aValues1: %@",aValues1);

Вот мой вывод:

2010-06-20 16:13:14.572 MatchGame[22675:207] image:lion.png, sound:lion, value:2
2010-06-20 16:13:14.574 MatchGame[22675:207] image:macaw.png, sound:macaw, value:10
2010-06-20 16:13:14.575 MatchGame[22675:207] arrayOfImages1: (
"lion.png",
"macaw.png")
2010-06-20 16:13:14.575 MatchGame[22675:207] arrayOfSounds1: (
macaw,
lion)
2010-06-20 16:13:14.576 MatchGame[22675:207] aValues1: {(
2,
10)}

Как, черт возьми, звук Ара оказался выше звука льва? Конечно, это не всегда происходит, но это нарушает игру, когда это происходит. Я уверен, что упускаю что-то глупое, но потратил достаточно времени, пытаясь понять это самостоятельно.

Ответы [ 2 ]

3 голосов
/ 21 июня 2010

Наборы не заказаны.В частности, порядок их получения будет зависеть от объектов, которые вы вводите, а не от порядка их добавления.(Часто они реализуются с использованием некоторого хэша объекта, хотя я не знаю, если это так.)

Поскольку вы хотите сохранить связку нескольких элементов, одним из вариантов будет сделатьодин объектный класс, который содержит их все и хранит в наборе.Затем вы можете получить его и прочитать его различные поля.

Другой вариант - просто скремблировать один список индексов и затем получить доступ к объектам в ваших различных исходных массивах в указанном порядке.

Обновление: сообщение, на которое вы ссылаетесь, решает проблему, отличную от вашей.В вашем случае, использование упорядочения по множеству для рандомизации - действительно неправильная вещь, потому что упорядочение не будет на самом деле случайным .Правильно, что нужно сделать, - это скремблировать один массив индексов, примерно так:

NSMutableArray *indices = [NSMutableArray arrayWithCapacity:11];
for ( int i = 0; i < 11; ++i )
    [indices addObject:[NSNumber numberWithInt:i]];
for ( int i = 0; i < 11; ++i )
    [indices exchangeObjectAtIndex:i withObjectAtIndex:(arc4random() % 11)];

NSLog(@"First random image: %@", [puzzleImages objectAtIndex:[[indices objectAtIndex:0] intValue]]);

и так далее.Ваша гарантия уникальности исходит из того факта, что вы начинаете с индексов 0..10 в списке и затем перемешиваете, а не пытаетесь вызвать сами индексы из генератора случайных чисел, который может создавать дубликаты.

1 голос
/ 21 июня 2010

У наборов нет порядка - поэтому, если вы хотите сохранить все в том же порядке, который вы добавили, вам нужно использовать массивы.

Также в этом случае, если у вас два одинаковых элемента в исходном массиве, вы будетеполучить меньше элементов из набора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...