【问题标题】:unable to create unique array of NSNumber - iOS无法创建唯一的 NSNumber 数组 - iOS
【发布时间】:2012-11-29 08:57:58
【问题描述】:

我阅读了一些关于制作唯一数组的 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

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

【问题讨论】:

标签: objective-c ios


【解决方案1】:

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

From the docs:

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

【讨论】:

    【解决方案2】:

    问题出在这里

    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* 元素;
    @property (nonatomic, strong, readwrite) NSMutableSet* set;
    
    @结尾
    
    @implementation 唯一数组
    
    - (id)初始化{
       self = [超级初始化];
    
       如果(!自我){
          返回零;
       }
    
       self.elements = [NSMutableArray 数组];
       self.set = [NSMutableSet 集];
    
       回归自我;
    }
    
    - (BOOL)addObject:(id)object {
       if ([self.set containsObject:object]) {
          返回否;
       }
    
       [self.set addObject:object];
       [(NSMutableArray*) self.elements addObject:object];
    
       返回是;
    }
    
    @结尾
    
    

    【讨论】:

    • 谢谢!我明白你的意思。即使类属性有NSNumber,它添加的是object 而不是NSNumber 字段,所以containObject 将无法定义NSNumber,因为它都是object。我说得对吗?
    【解决方案3】:

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

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

    【讨论】:

    • 啊,是的,那也可以解决我的问题。只是我在 c# 中有一个以前的函数已经在工作了,所以我只是想将它复制到 Xcode 中,而不是考虑另一种方法来实现我的函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    相关资源
    最近更新 更多