2011-11-22 8 views
2

최대 값에 대해 변경 가능한 배열을 검색하고 값과 위치를 반환해야합니다. 내가 한 번만 배열을 반복하고 싶습니다 그리고 가능하다면 잘 모르겠어요NSMutableArray에서 최대 값과 위치를 찾는 방법

내가 달성하기 위해 노력하고있어의 예

NSMutableArray *array = [[NSMutableArray alloc] init]; 
    for (int i = 0; i<20; i++) 
     [array addObject:[NSNumber numberWithInteger:(arc4random()%200)]]; 

    NSObject *max = [array valueForKeyPath:@"@max.self"]; 

아래 입증 할 수

max 객체는 것 (위치가 아닌) 값을 포함합니다. 디버거를 통해 시연 할 수 있습니다 print-object max

거기에 어떤 조언이 있습니까?

+0

은'max' 개체 값에 하나 개 이상의 발생이있을 수 있기 때문에 위치가 없습니다를 찾을 수 있습니다 귀하의 배열. –

답변

4

valueForKeyPath:@"@max.self"을 사용하면 최대 값을 원하는 경우에만 유용합니다.

내가 enumerateWithBlock:

NSMutableArray *array = [[NSMutableArray alloc] init]; 
for (int i = 0; i<20; i++) 
    [array addObject:[NSNumber numberWithInteger:(arc4random()%200)]]; 

__block NSUInteger maxIndex; 
__block NSNumber* maxValue = [NSNumber numberWithFloat:0]; 
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    NSNumber* newValue = obj; 
    if ([newValue isGreaterThan:maxValue]) { 
     maxValue = newValue; 
     maxIndex = idx; 
    } 
}]; 

확실히 더 많은 코드를 사용하는 것, 하나 개의 반복에서 모두 인덱스와 값을 알고 있지만 배열에 한 번만 반복하고 있습니다.

+0

나를 위해 더 읽기 (블록이란 무엇입니까?)하지만 작동합니다 ... 또한 간접적으로 두 번째 문제를 해결하므로 감사합니다 – Rasman

+1

블록은 다른 프로그래밍 언어에서도 사용할 수있는 클로저입니다. 당신이 말했듯이, 더 많은 독서! 공식 문서 : http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html – gcamp

3

배열에 둘 이상의 동일한 최대 값이있을 가능성이 염려되지 않으면 -indexOfObject:을 사용하여 색인을 가져올 수 있습니다. 배열에서 객체의 첫 번째 항목을 반환합니다.

+0

그게 내가 피하려고 노력하고있어 : 내 배열을 통해 두 번째 반복. 내 예제에는 20 개의 객체가 있고, 실제 코드는 훨씬 더 많으며 정기적으로 다시 처리됩니다. – Rasman

+0

배열 끝에 객체를 삽입해야하는 특별한 이유가 있습니까? 배열 정렬을 유지하는 방식으로 객체를 삽입하거나 심지어 최대 값을 쉽게 찾을 수있는 다른 데이터 구조를 사용하는 것을 고려해야합니다 (최대 힙이 아마도?). – Sean

+0

@gcamp, yup 죄송합니다. 나는 그 처음 읽는 것을 놓쳤다. – Sean

2

다음 해결책을 사용하면 배열의 최대 값을 식별하는 데 도움이되기를 바랍니다.

int max = [[numberArray valueForKeyPath:@"@max.intValue"] intValue];  
NSLog(@"Highest number: %i",max); 

문제가 있으면 알려주십시오. 여기

+1

@iPatel, 다른 최상의 것을 찾지 못했다면 답을 편집하지 마십시오. 대안 솔루션. prefix.b에 약간의 공간을 추가했습니다. 이러한 일을하지 마십시오. –

+1

@iPatel이 형식을 수정했습니다. 그게 잘못이 아니야. –

+0

응답과 편집에는 차이가 있습니다. 만약 당신이 다른 솔루션을 가지고, 당신은 별도의 답변을 넣어 야합니다. 그러나 형식을 편집하는 것은 허용 가능하며 편집하기에 좋습니다. –

관련 문제