0

我正在尝试将 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)。谁能帮我解决这个问题?

4

3 回答 3

2

这取决于您想要的优化程度。这是一个为每个范围重新采样“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;
}
于 2012-06-04T12:57:48.390 回答
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;
        }
    }
}
于 2012-06-04T13:15:50.707 回答
1

假如说

  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
   }
}
于 2012-06-04T12:49:28.923 回答