2012-06-04 119 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; 
     } 
    } 
} 
相關問題