2014-09-12 3 views
1

Это то, что я пытаюсь сделать. Получайте 7 случайных, не повторяющихся чисел каждый раз, когда запускается мой viewDidLoad. Я получил его, чтобы создать randoms, но я пытался очистить NSMutableSet, когда он загружается, чтобы получить свежий набор, и у меня проблемы. NSLog явно показывает, что ничего нет в NSMutableSet, но всегда он имеет одинаковые номера в одном порядке?Не удается очистить/перезагрузить NSMutableSet?

// Create set 
NSMutableSet *mySet = [NSMutableSet setWithCapacity:6]; 

// Clear set 
NSMutableSet *mutableSet = [NSMutableSet setWithSet:mySet]; 
[mutableSet removeAllObjects]; 
mySet = mutableSet; 

NSLog(@"mutableSet: %@", mutableSet); // Shows nothing 
NSLog(@"mySet: %@", mySet); // Shows nothing 

// Assign random numbers to the set 
while([mySet count]<=6){ 
    int Randnum = arc4random() % 7+1; 
    [mySet addObject:[NSNumber numberWithInt:Randnum]]; 
} 

NSLog(@"mySet1: %@", mySet); // Always shows 5,1,6,2,7,3,4 ??? 

ответ

1

NS(Mutable)Set является неупорядоченной коллекцией, она не сохраняет порядок элементов, как они были введены. Таким образом, ваш вывод показывает, что набор содержит номера от 1 до 7.

У вас есть разные варианты получения ожидаемого результата.

  1. Вместо этого используйте NSMutableOrderedSet.

  2. Используйте набор для отслеживания числа, которые уже произошли, но хранить номера также в массиве:

    NSMutableArray *numbers = [NSMutableArray array]; 
    NSMutableSet *mySet = [NSMutableSet set]; 
    while ([numbers count] < 6) { 
        NSNumber *randNum = @(arc4random_uniform(7) + 1); 
        if (![mySet containsObject:randNum]) { 
         [numbers addObject:randNum]; 
         [mySet addObject:randNum]; 
        } 
    } 
    NSLog(@"numbers: %@", numbers); 
    
  3. Для небольшого набора (как 7 числа в вашем случае), вам могли бы просто использовать только массив:

    NSMutableArray *numbers = [NSMutableArray array]; 
    while ([numbers count] < 6) { 
        NSNumber *randNum = @(arc4random_uniform(7) + 1); 
        if (![numbers containsObject:randNum]) { 
         [numbers addObject:randNum]; 
        } 
    } 
    NSLog(@"numbers: %@", numbers); 
    
+0

Мне нравится версия массива намного лучше. Благодаря! – user1467534

Смежные вопросы