如何将NSArray中的对象与两个不同NSArray中的两个不同对象进行比较?

时间:2012-06-04 12:31:48

标签: objective-c nsarray

我试图将NSArray中的一个对象与两个不同NSArray中的两个对象进行比较,我希望存储该对象的第一个出现并丢弃下一个对象。

e.g: -

我有一个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)这样的对象和另一个包含像(21.0,24.0,29.0,32.0,34.0)等对象的Array3

现在我要存储介于两者之间的第一个对象(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)。有人可以帮我解决一下这个问题吗?

3 个答案:

答案 0 :(得分:2)

这取决于您希望的优化程度。这是一个重新采样&#34; Array1&#34;对于每个范围。如果您要过滤大量对象(并对它们进行排序),您可以存储最后找到的位置,以便更快地进行后续搜索。

- (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;
}

答案 1 :(得分: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;
        }
    }
}

答案 2 :(得分:1)

假设

  1. 所有数组都按升序排序
  2. array2.count == array3.count
  3. array2的第n个对象小于array3的第n个对象
  4. 您可以执行以下操作

    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
       }
    }