2014-09-12 74 views
1

这就是我想要做的事。每次我的viewDidLoad开始时,获取7个随机,非重复的数字。我得到了它的创建随机量,但我一直在试图清除的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 2014-09-15 17:25:34