2012-06-04 82 views
0

我想获得一个NSArray中的对象与两个不同的NSArrays中的两个对象的比较,我想存储该对象的第一个出现并丢弃下一个。如何将NSArray中的对象与两个不同NSArrays中的两个不同对象进行比较?

e.g: -

我有一个数组1,其中它包含象对象(20.12,20.15,21.4,22.6,23.0,24.2,28.7,30.5,30.9,32.6,33.7)。 现在我有一个包含类似的对象另一个数组2(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)。任何人都可以请帮助我如何得到这个?

+0

它 – jothikenpachi

回答

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

假设

  1. 所有数组是有序的升序
  2. array2.count == array3.count
  3. 数组2的第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 
    } 
} 
+0

改变只是创建的NSMutableArray并添加Cliktervel如果(inRange.count){ [array4 addObject:[inRange firstObject]]; }在上面提到的代码中,NSArray没有用选择器'firstObject'声明一个方法...你可以检查一次吗? –

+0

对不起,它应该是'objectAtIndex:0'。更正了答案。 (有一个方法'lastObject',所以我只是假定'firstObject'也有一个。) – Mundi

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; 
     } 
    } 
} 
相关问题