【问题标题】:How to compare objects in an NSArray with two different objects in two different NSArrays?如何将 NSArray 中的对象与两个不同 NSArray 中的两个不同对象进行比较?
【发布时间】:2012-06-04 12:31:47
【问题描述】:

我正在尝试将 NSArray 中的一个对象与两个不同 NSArray 中的两个对象进行比较,我想存储该对象的第一次出现并丢弃下一个。

例如:-

我有一个 Array1,其中包含 (20.12, 20.15, 21.4, 22.6, 23.0, 24.2, 28.7, 30.5, 30.9, 32.6, 33.7) 之类的对象。 现在我有另一个 Array2 包含像 (20.00, 22.0, 28.0, 30.0, 33.0) 这样的对象和另一个 Array3 包含像 (21.0, 24.0, 29.0, 32.0, 34.0) 这样的对象

现在我想存储介于 (20.00 - 21.0, 22.0 - 24.0, 28.0 - 29.0, 30.0 - 32.0, 33.0 - 34.0) 之间的第一个对象。我试图通过使用

来实现这一点
if (clickTimeInterval >= [[Array2 objectAtIndex:i] doubleValue] && clickTimeInterval <= [[Array3 objectAtIndex:i] doubleValue]) {

我的 clickTimeInterval 是存储在我的 Array1 中的时间间隔。我能够获取这些值,但我只想存储首先出现的值并存储到 Array4 中。它看起来像 Array4 = (20.12, 22.6, 24.2, 28.7, 30.5, 33.7)。谁能帮我看看如何得到这个?

【问题讨论】:

  • 只需创建 NSMutableArray 并在其中添加 Cliktervel

标签: objective-c nsarray


【解决方案1】:

这取决于您想要优化的程度。这是一个为每个范围重新采样“Array1”的版本。如果您有大量对象要过滤(并且它们已排序),您可以存储最后找到的位置,以便更快地进行后续搜索。

- (NSArray *)bucketTest {
    NSMutableArray *result = [NSMutableArray array];

    NSArray *samples = [NSArray arrayWithObjects:[NSNumber numberWithDouble:1.1], [NSNumber numberWithDouble:1.5], [NSNumber numberWithDouble:2.2], nil];
    NSArray *lows = [NSArray arrayWithObjects:[NSNumber numberWithDouble:1.0], [NSNumber numberWithDouble:2.0], nil];
    NSArray *highs = [NSArray arrayWithObjects:[NSNumber numberWithDouble:2.0], [NSNumber numberWithDouble:3.0], nil];
    for (int bucket = 0; bucket < [lows count]; bucket++) {
        double low = [[lows objectAtIndex:bucket] doubleValue];
        double high = [[highs objectAtIndex:bucket] doubleValue];
        for (NSNumber *sample in samples) {
            if (([sample doubleValue] >= low) && ([sample doubleValue] < high)) {
                [result addObject:sample];
                break;
            }
        }
    }
    return result;
}

【讨论】:

    【解决方案2】:

    提高第一个答案的效率。 这里我假设所有的数组都是排序的

    再制作一个我们将在每次迭代中更改的数组

    NSArray *array5 = [array1 copy];
    
    NSMutableArray *array4 = [NSMutableArray array];
    for (int i=0; i < array2.count; i++) {
        NSNumber *bottom = [array2 objectAtIndex:i];
        NSNumber *top = [array3 objectAtIndex:i];
        NSPredicate *greaterThanPredicate = [NSPredicate predicateWithFormat:
                                             @"SELF > %@", bottom];
        NSMutableArray *arrayWithBiggerObjects = [NSMutableArray arrayWithArray:[array5 filteredArrayUsingPredicate:greaterThanPredicate]];
    
        if (arrayWithBiggerObjects.count) {
            NSNumber *lowestObject = [arrayWithBiggerObjects objectAtIndex:0];
            if ([lowestObject compare:top] == NSOrderedDescending) {
                [array4 addObject:lowestObject];
                [arrayWithBiggerObjects removeObject:lowestObject];
                array5 = arrayWithBiggerObjects;
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      假设

      1. 所有数组都按升序排列
      2. array2.count == array3.count
      3. array2的第n个对象小于array3的第n个对象

      您可以执行以下操作

      NSMutableArray *array4 = [NSMutableArray array];
      for (int i=0; i < array2.count; i++) {
         NSNumber *bottom = [array2 objectAtIndex:i];
         NSNumber *top = [array3 objectAtIndex:i];
         NSPredicate *betweenPredicate = [NSPredicate predicateWithFormat:
            @"SELF > %@ && SELF < %@", bottom, top]; 
         NSArray *inRange = [array1 filteredArrayUsingPredicate:betweenPredicate];
         if (inRange.count) {
            [array4 addObject:[inRange objectAtIndex:0]];
         }
         else {
            [array4 addObject:[NSNull null]]; // or don't add anything
         }
      }
      

      【讨论】:

      • if (inRange.count) { [array4 addObject:[inRange firstObject]];在提到的代码中,NSArray 没有使用选择器'firstObject'声明一个方法......你能检查一次吗?
      • 对不起,应该是objectAtIndex:0。更正了答案。 (有lastObject的方法,所以我假设firstObject也有一个。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多