我的iPhone应用程序中有一系列的仪表读数。我一直试图通过迭代数组并减去两个连续元素来计算消耗。我已经尝试了几种方法,但我总是引用一个超出范围的索引。
这是我最近的消费尝试:
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++;
}
}
对于记录,Reading对象是一个Core Data实体,它的value
键有一个浮点数(由Core Data存储为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
我得到相同的结果时只有索引out of边界是一个较低的,12。
另外,为什么for循环再次从1开始循环?
我知道这可能不是一个Objective-C问题,而是与算法有关,但我现在已经挣扎了一段时间,所以如果有人能指出明显的话我会非常感激。
答案 0 :(得分: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
。