【问题标题】:Check if the values in an array go below a specific value检查数组中的值是否低于特定值
【发布时间】:2013-08-15 13:14:02
【问题描述】:

我有一个双值数组,其范围可以从 0.0 到 100.0。如果任何值低于 10.0,我想提醒用户。我做了一些搜索,我能找到的最接近的是:

- (BOOL)containsObject:(id)anObject

有什么方法可以使用这个方法来查看值是否低于 10?我尝试了以下代码行,但收到​​了两个错误。

if ([myArray containsObject:[NSNumber numberWithDouble:(<10)])
{
    // Do something
}

我将不胜感激。这似乎是一项非常基本的任务。

【问题讨论】:

    标签: ios


    【解决方案1】:

    如果它不是一个包含大量数据的数组,我看不出你为什么不这样做的原因:

       for (NSNumber *number in myArray) {
            if ([number floatValue] < 10.0) {
                // alert user 
            }
        }
    

    【讨论】:

    • 即使对于大型(未排序)数组,这也是最有效的解决方案。
    • @MartinR 甚至与使用 NSPredicate 相比?
    • @sbarow:使用 NSPredicate 可以分配和填充一个新数组,所以我假设简单的枚举更快。
    • 速度差异可以忽略不计,除非您正在处理一个非常大的数组。 NSPredicate 可能会做一些类似于答案的事情,或者它可能会对它进行排序,然后再通过它(除非在后台发生了一些魔法),无论哪种方式,除非你正在处理用户不会处理的大量数据'不知道区别。上面的答案是一个简单易懂的解决方案,可以应用于其他编程语言,NSPredicate 不行(虽然很多语言都有自己的版本,但是需要你去查)
    • 这正是我所需要的。谢谢!
    【解决方案2】:

    使用NSPredicate 更快

    NSPredicate *predicatePeople =  [NSPredicate predicateWithFormat:@"(startValue => %f) BETWEEN (endValue <= %f))",startNSNumber,endNSNumber];
    
    NSArray *filteredArray = [myArray filteredArrayUsingPredicate:predicatePeople];
    if(filteredArray.count > 0)
    {
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Information" message:@"MyArray Contain between 1 to 10 value" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
         [alert show];
    }
    

    【讨论】:

    • 为什么你认为 NSPredicate 更快?我会假设 创建一个新数组 比简单的枚举要慢。 - 顺便提一句。在你的谓词中使用 BETWEEN 是错误的。
    【解决方案3】:

    另外,containsObject: 的使用是为了“等于”目的,例如 [myArray containsObject:[NSNumber numberWithDouble:2.0]],而不是像您所做的那样有条件。 所以,最好的是JPetric提到的。

    for (NSNumber *number in myArray) {
            if ([number floatValue] < 10.0) {
                // alert user 
            }
        }
    

    【讨论】:

      【解决方案4】:

      我会使用积木,它们更酷,有助于熟悉它们:

      [myArray enumerateObjectsWithBlock^(NSNumber *number, NSUInteger indx, BOOL *stop) {
          if ([number floatValue] < 10.0) {
              // alert user
      
              // kill the loop to prevent unnecessarily going through all the elements
              stop = YES;
          }
      }];
      

      如果您确实想要用户快速枚举,请包含一个中断:

      for (NSNumber *number in myArray) {
           if ([number floatValue] < 10.0) 
                 // alert user 
                 break; // kills the loop
           }
       }
      

      如果您只关心一个项目是否小于 10,这些方法效果很好,因为您不需要每次都检查每个元素。此外,如果是这种情况,谓词效率不高,因为它们会过滤整个数组,而实际上您只关心一个项目(10 以下的第一项)。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 2011-05-29
      • 2018-10-13
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多