0

私のiPhoneアプリにはメーターの読み値の配列があります。配列を反復処理し、連続する 2 つの要素を減算して、消費量を計算しようとしています。いくつかの方法を試しましたが、常に範囲外のインデックスを参照しています。

これは、消費量を取得するための私の最新の試みです。

    NSMutableArray *mutableConsumption = [[NSMutableArray alloc] init];

    int i = 0;
    while (i < [readings count]) {
        for (int j = 1; j < [readings count]; j++) {
            NSLog(@"i: %i, j: %i", i, j);
            NSNumber *prev = [[readings objectAtIndex:i] valueForKey:@"value"];
            NSNumber *this = [[readings objectAtIndex:j] valueForKey:@"value"];
            float consumed = [this floatValue] - [prev floatValue];
            NSLog(@"consumed: %f", consumed);

            [mutableConsumption addObject:[NSNumber numberWithFloat:consumed]];
            i++;
        }
    }

valueレコードの場合、Reading オブジェクトは、そのキー (Core Data によって NSNumber として格納される)のフロートを持つ Core Data エンティティです。

これは私がコンソールに出力しているものです:

    2013-04-26 20:08:16.305 Csekkolj[4608:c07] HEATING readings.count: 13
    2013-04-26 20:08:16.305 Csekkolj[4608:c07] i: 0, j: 1
    2013-04-26 20:08:16.306 Csekkolj[4608:c07] consumed: 58.416016
    2013-04-26 20:08:16.306 Csekkolj[4608:c07] i: 1, j: 2
    2013-04-26 20:08:16.306 Csekkolj[4608:c07] consumed: 38.247070
    2013-04-26 20:08:16.307 Csekkolj[4608:c07] i: 2, j: 3
    2013-04-26 20:08:16.307 Csekkolj[4608:c07] consumed: 25.605957
    2013-04-26 20:08:16.307 Csekkolj[4608:c07] i: 3, j: 4
    2013-04-26 20:08:16.307 Csekkolj[4608:c07] consumed: 29.143066
    2013-04-26 20:08:16.308 Csekkolj[4608:c07] i: 4, j: 5
    2013-04-26 20:08:16.308 Csekkolj[4608:c07] consumed: 23.701904
    2013-04-26 20:08:16.308 Csekkolj[4608:c07] i: 5, j: 6
    2013-04-26 20:08:16.309 Csekkolj[4608:c07] consumed: 29.482178
    2013-04-26 20:08:16.309 Csekkolj[4608:c07] i: 6, j: 7
    2013-04-26 20:08:16.309 Csekkolj[4608:c07] consumed: 53.989990
    2013-04-26 20:08:16.310 Csekkolj[4608:c07] i: 7, j: 8
    2013-04-26 20:08:16.310 Csekkolj[4608:c07] consumed: 97.111816
    2013-04-26 20:08:16.311 Csekkolj[4608:c07] i: 8, j: 9
    2013-04-26 20:08:16.311 Csekkolj[4608:c07] consumed: 157.211182
    2013-04-26 20:08:16.312 Csekkolj[4608:c07] i: 9, j: 10
    2013-04-26 20:08:16.312 Csekkolj[4608:c07] consumed: 187.606934
    2013-04-26 20:08:16.312 Csekkolj[4608:c07] i: 10, j: 11
    2013-04-26 20:08:16.313 Csekkolj[4608:c07] consumed: 183.083008
    2013-04-26 20:08:16.313 Csekkolj[4608:c07] i: 11, j: 12
    2013-04-26 20:08:16.313 Csekkolj[4608:c07] consumed: 143.708008
    2013-04-26 20:08:16.314 Csekkolj[4608:c07] i: 12, j: 1
    2013-04-26 20:08:16.315 Csekkolj[4608:c07] consumed: -968.891113
    2013-04-26 20:08:16.315 Csekkolj[4608:c07] i: 13, j: 2
    2013-04-26 20:08:16.316 Csekkolj[4608:c07] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFArray objectAtIndex:]: index (13) beyond bounds (13)'

13 個の要素を持つ配列には 0 から 12 までのインデックスが付けられているため、配列インデックス #13 がないことを理解しています。しかしi < [readings count]-1、同じ結果が得られるまで while ループを実行しようとすると、範囲外のインデックスは 1 つ下の 12 になります。 、なぜ for ループは再び 1 からループを開始するのですか?

これはおそらくObjective-Cの質問ではなく、アルゴリズムに関するものであることはわかっていますが、しばらく苦労しているので、誰かが明白なことを指摘できれば非常に感謝しています.

4

1 に答える 1

0

ご存知のように、配列の最後の有効なインデックスは ですがcount-1、減算のペアを形成する次の要素がないため、実際にはその前の要素でループを停止する必要があります。

ループは次のようになります。

NSUInteger count = [array count];
for( NSUInteger i = 0; i <= (count - 2); i++ ){
    id curr = [array objectAtIndex:i];
    id next = [array objectAtIndex:i+1];

    // Calculate...
}

このようにして、最後の要素である index の要素を、count-1最後の反復で として取得しますnext

于 2013-04-26T18:38:55.403 に答える