2013-04-26 63 views
0

我在我的iPhone應用程序中有一系列的儀表讀數。我一直試圖通過迭代數組並減去兩個連續元素來計算消耗。我嘗試過幾種方法,但我總是提到索引超出範圍。如何減去NSArray中的兩個連續元素

這是我在獲得消費最新嘗試:

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鍵浮動(被存儲爲一個NSNumber的核心數據核心數據實體)。

這就是我越來越打印到控制檯:

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與13個元素的數組的索引值從0到12,但是當我嘗試運行while循環直到i < [readings count]-1我得到相同的結果只有索引越界是一個較低的12。 此外,爲什麼for循環從1再次循環?

我知道這可能不是一個Objective-C問題,而是與算法有關,但我現在正在努力處理它,所以如果有人能指出明顯的問題,我將非常感激。

回答

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... 
} 

這樣,您將獲得最後一個元素,一個索引count-1,在最後一次迭代的next

+0

謝謝!我想我也試過這個,我只是不知道了。現在看來我的代碼在不同的數組中也是錯誤的,因爲我在計算後得到了一些方法調用(通過Core Plot),最終我得到了另一個超出界限的異常。 另外,如果我是對的,我錯過了一個消費數據,因爲我現在得到的最後一個數據是183.083008。對不起,如果我沒有得到你的解釋正確的,但爲什麼我失去了最後一個(143.xxx)? – 2013-04-26 18:53:10

+0

我不確定。你確定你應該得到這個結果嗎?你是否親手檢查過配對? – 2013-04-26 19:04:28

+0

是的,我添加了與電子表格中相同的讀數,並獲得相同的消耗量。 – 2013-04-26 19:14:41