0

NSArray 内のオブジェクトを 2 つの異なる NSArray 内の 2 つのオブジェクトと比較しようとしていますが、最初に出現したオブジェクトを保存し、次のものを破棄したいと考えています。

例えば:-

(20.12、20.15、21.4、22.6、23.0、24.2、28.7、30.5、30.9、32.6、33.7) のようなオブジェクトを含む Array1 があります。(20.00、22.0、28.0、30.0、33.0) のようなオブジェクトを含む別の Array2 と、(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) のようになります。誰かがこれを取得する方法について私を助けてもらえますか?

4

3 に答える 3

2

最初の回答の効率を改善します。ここでは、すべての配列がソートされていると仮定しています

各反復で変更する配列をもう 1 つ作成します

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 に答える
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 に答える
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 に答える