0

我在一些关于制作独特数组的 SO 线程上阅读,不幸的是,它对我不起作用。

背景资料 -

  • 我有一个 objectArray,里面有 20 个对象。
  • 带有字段 NSNumber * number 的 NSObject sampleData;
  • maxCount 是一个 int,用户可以输入他们想要的随机数。
  • 下面是我在 Xcode 中的代码和调用函数的返回

.m

-(IBAction) testButton
{
[self chooseNumber];
}

-(void)chooseNumber
{
    maxCount = [numberOfClues.text intValue];
   // NSInteger rdmNumber = arc4random()%objectArray.count;

    int count = 0;
    do {

        NSInteger rdmNumber = arc4random()%objectArray.count;
        if (![dataArray containsObject:[NSNumber numberWithInt:rdmNumber]])
        {
            currentData.number = [NSNumber numberWithInt:rdmNumber];
            [dataArray addObject:currentData];
            currentData=nil;
            currentData= [[sampleData alloc]init];
            count++;    
            NSLog(@"random no - %d",rdmNumber);
        }
    } while (count < maxCount);
    NSLog(@"Array got %d numbers",dataArray.count);
}

从 NSLog 返回值

2012-11-29 08:26:50.888 randomNumbers[1255:11303] random no - 5
2012-11-29 08:26:50.892 randomNumbers[1255:11303] random no - 8
2012-11-29 08:26:50.926 randomNumbers[1255:11303] random no - 5
2012-11-29 08:26:50.930 randomNumbers[1255:11303] random no - 10
2012-11-29 08:26:50.933 randomNumbers[1255:11303] random no - 4
2012-11-29 08:26:50.946 randomNumbers[1255:11303] random no - 10
2012-11-29 08:26:50.949 randomNumbers[1255:11303] random no - 9
2012-11-29 08:26:50.952 randomNumbers[1255:11303] random no - 12
2012-11-29 08:26:50.955 randomNumbers[1255:11303] random no - 0
2012-11-29 08:26:50.957 randomNumbers[1255:11303] random no - 15
2012-11-29 08:26:50.960 randomNumbers[1255:11303] random no - 1
2012-11-29 08:26:50.963 randomNumbers[1255:11303] random no - 8
2012-11-29 08:26:50.964 randomNumbers[1255:11303] random no - 18
2012-11-29 08:26:50.966 randomNumbers[1255:11303] random no - 14
2012-11-29 08:26:50.968 randomNumbers[1255:11303] random no - 12
2012-11-29 08:26:50.977 randomNumbers[1255:11303] random no - 14
2012-11-29 08:26:50.980 randomNumbers[1255:11303] random no - 3
2012-11-29 08:26:50.983 randomNumbers[1255:11303] random no - 6
2012-11-29 08:26:50.986 randomNumbers[1255:11303] random no - 15
2012-11-29 08:26:50.989 randomNumbers[1255:11303] random no - 7
2012-11-29 08:26:50.992 randomNumbers[1255:11303] Array got 20 numbers

如何使数组获得所有唯一编号?

4

3 回答 3

2

你真的需要一个数组吗?为什么不使用 NSMutableSet?

从文档

NSMutableSet 类声明了一个可变的、无序的不同对象集合的编程接口。

于 2012-11-29T09:03:24.583 回答
1

问题出在这里

if (![dataArray containsObject:[NSNumber numberWithInt:rdmNumber]]) {
     currentData.number = [NSNumber numberWithInt:rdmNumber];
     [dataArray addObject:currentData];

您正在检查NSNumber实例,但没有放入NSNumber数组中,而是放入了完全不同的东西(currentData)。

如果您需要排序(您真的需要排序吗?)和唯一性,可以使用 和 的组合来提高效率NSArrayNSSet当然,这只有在您执行大量需要唯一性检查的操作时才会更有效。如果您只想创建一个数组并在不更改的情况下使用它,那么您的实现(使用[NSArray containsObject:]会更好。将所有内容抽象到一个特殊的类中始终是一个很好的解决方案:

@interface UniqueArray

@property (nonatomic, strong, readonly) NSArray* elements;

- (BOOL)addObject:(id)object;

@end
@interface UniqueArray ()

@property (nonatomic, strong, readwrite) NSArray* elements;
@property (nonatomic, strong, readwrite) NSMutableSet* set;

@end

@implementation UniqueArray

- (id)init {
   self = [super init];

   if (!self) {
      return nil;
   }

   self.elements = [NSMutableArray array];
   self.set = [NSMutableSet set];

   return self;
}

- (BOOL)addObject:(id)object {
   if ([self.set containsObject:object]) {
      return NO;
   }

   [self.set addObject:object];
   [(NSMutableArray*) self.elements addObject:object];

   return YES;
}

@end

于 2012-11-29T09:05:55.060 回答
1

我想这已经被问过了。您可以用数字 1 到 20 填充数组,将数组打乱,然后从打乱的数组中选择前 (n) 个数字。

我在这里回答:https ://stackoverflow.com/a/12649065/210171

于 2012-11-29T09:20:15.437 回答