2011-01-01 4 views
0

핵심 데이터 엔티티의 레코드 그룹화를 수행 한 다음 계산하여 가장 높은 수의 그룹을 찾을 수있는 방법은 무엇입니까?NSSet을 그룹화 한 다음 어떻게 계산합니까?

나는 각각 '승자'를 가진 많은 '다리'가있는 '세트'를 가지고 있습니다. 내가 대답하려고하는 질문은 : 누가 가장 많이 얻었는지.

도움을 주시면 감사하겠습니다. 아, 새해 복 많이 받으세요!

답변

0

집합을 반복하고 각 '승자'에 대해 '다리'를 계산하십시오. 사전에 다리 수를 저장하십시오 :

NSMutableDictionary* legCount = [[NSMutableDictionary alloc] init]; 
NSNumber* count; 
for (leg in legsSet) { 
    id winner = [leg objectForKey:@"winner"]; // assumes leg is a dictionary 
    if (count = [legCount objectForKey:winner]) { 
     [legCount setObject:[NSNumber numberWithInt:[count intValue]+1] forKey:winner]; 
    } else { 
     [legCount setObject:[NSNumber numberWithInt:1] forKey:winner]; 
    } 
} 

이제 가장 높은 값으로 새 사전에서 키를 찾아야합니다.

id winner = [[legCount keysSortedByValueUsingComparator:^(id obj1, id obj2) { 

    if ([obj1 intValue] > [obj2 intValue]) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 

    if ([obj1 intValue] < [obj2 intValue]) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
}] lastObject]; 
+0

고맙습니다. 첫 번째 비트가 작동하는 데 문제가 있습니다. 내 다리가 세트이기 때문에 나는 이드 우승자 라인을 다음과 같이 변경했다 : id winner = [leg valueForKey : @ "winner"]; 'NSInvalidArgumentException', 이유 : '- [Players copyWithZone :] : 인식 할 수없는 선택기가 인스턴스 0x4d80180으로 전송되었습니다'라는 이유로 else 행에서 충돌합니다. 또한 "if (count = [legCount objectForKey : winner])"는 무엇을하려고합니까? – lps

+0

코드를 직접 테스트하지 않았습니다. 오브젝트 승자가 유효한 오브젝트인지 확인하십시오 (nil이 아니어야 함). if-line은 키가 이미 설정되어 있는지 확인하고, 아무 것도 값을 1로 설정하지 않았 으면 yes로 변경하고 값을 1 씩 증가시킵니다. 오 .. 그리고 방금 내 코드에서 몇 가지 오류를 발견했습니다 ... 고칠 것입니다. – Felix

+0

승자가 유효합니다. 각 다리마다 승자가 있지만 위의 오류가 발생합니다. – lps

관련 문제