2013-04-26 3 views
0

내 iPhone 응용 프로그램에 미터 판독 값의 배열이 있습니다. 나는 배열을 반복하고 두 개의 연속적인 원소를 빼서 소비량을 계산하려고 노력해왔다. 여러 가지 방법을 시도했지만 항상 경계를 벗어난 색인을 참조합니다.NSArray에서 두 개의 연속 요소를 빼는 방법

입니다 소비 점점에서 내 최신 시도 : 독서 객체가 코어 데이터에 의해의 NSNumber로 저장됩니다의 value 키에 대한 플로트 (있는 코어 데이터 엔티티 기록을 위해

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++; 
     } 
    } 

을).

내가 콘솔에 인쇄지고있어 무엇 :

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 개 요소로 구성된 배열이 12 0에서 인덱싱으로이 없다는 것을 이해하지만, i < [readings count]-1까지 while 루프를 실행합니다. 범위 밖의 인덱스 만 동일한 결과를 얻습니다. 또한 for 루프가 1에서 다시 반복되기 시작합니까?

나는 이것이 Objective-C 문제조차도 알지 못하지만 알고리즘과 관련이있다. 그러나 나는 잠시 동안 고민하고있다. 그래서 누군가가 명백한 것을 지적 할 수 있다면 매우 감사 할 것이다.

답변

0

알고 계시 겠지만 배열의 마지막 유효한 인덱스는 count-1입니다. 그러나 감산 할 쌍을 구성 할 다음 요소가 없으므로 실제로 그 전에 한 요소에서 루프를 중지하고 싶습니다. next 당신이 마지막 요소, 인덱스 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... 
} 

이 방법을, 마지막 반복에서 :

루프는 다음과 같이 보일 것입니다.

+0

감사합니다. 나는 이걸 한번 시도한 것 같아. 이제는 더 이상 몰랐어. 이제 내 코드가 다른 배열에서도 틀린 것 같다. 왜냐하면 계산 후 (코어 플롯에 의한) 일부 메소드 호출이 생겨서 결국에는 다른 예외를 벗어난다. 또한, 내가 옳다면 지금 얻게되는 마지막 소비 자료가 183.083008이므로 하나의 소비 데이터가 누락됩니다. 미안하지만 당신의 설명을 제대로하지 못했지만 왜 마지막 하나 (143.xxx)를 잃었습니까? –

+0

잘 모르겠습니다. 그 결과를 얻기로되어 있다고 확신합니까? 손으로 쌍을 확인 했습니까? –

+0

예, 필자는 스프레드 시트에있는 것과 동일한 판독 값을 추가했으며 소비량은 같았습니다. –

관련 문제