2012-04-14 5 views
2

하위 배열이 조건을 충족시키는 배열에서 개수를 원합니다. 나는이 일을 할 수 있다고 생각했지만 할 수는 없었다.조건부 nsarray 개수

NSLog(@"%d",[[_sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
      [[obj objectAtIndex:4] isEqualToString:@"1"]; 
     }] count]); 
+0

작동하지 않는 기능은 무엇입니까? 결과는 무엇이며, 입력 데이터는 무엇입니까? – pmdj

+0

코드 자동 완성에 카운트가 표시되지 않고 "잘못된 수신자 유형 'void'"가 표시됩니다. – Darren

답변

8

enumerateObjectsUsingBlock: 아무 것도 반환하지 않습니다. 그 코드는 컴파일되지 않을 것입니다. (그리고 주석이 말한 것처럼 자동 완성 기능이 작동하지 않습니다.

NSArray의 indexesOfObjectsPassingTest: 을 사용하고 의 count을 사용하십시오.

Documented here.

+0

indexOfObjectPassingTest는 첫 번째 발생을 반환한다고 말합니다. – Darren

+0

@Darren - 답변에서 오타를 입력하고 대신 색인을 생성합니다. – jrturton

+0

오른쪽. 복수 방법이 있습니다 : 색인 ** es ** OfObject ** s ** PassingTest. NSIndex ** Set **를 반환합니다. – Wienke

2

bbum이 옳다. indexesOfObjectsPassingTest를 사용해야합니다. 더 간단합니다.

하지만 다음과 같이 시험 합격자를 계산 enumerateObjectsUsingBlock을 사용할 수 있습니다 : 그것은 그 여분의 가변 배열을 필요로하기 때문에

NSArray *sections = [NSArray arrayWithObjects:@"arb", @"1", @"misc", @"1", @"extra", nil]; 
NSMutableArray *occurrencesOf1 = [NSMutableArray array]; 
[sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if ([(NSString*)obj isEqualToString:@"1"]) 
     [occurrencesOf1 addObject:obj]; 
}]; 
NSLog(@"%d", [occurrencesOf1 count]); // prints 2 

그것은 비효율적입니다. (하나를 접수대로 bbum의 답변을 확인해야합니다 그래서 -하지만 난 너무 블록 기능에 새로 온 사람, 그리고 퍼즐을 감사합니다.)

(더 읽기 IMO와)

+2

상세 검색; 블록 외부에서'__block NSUInteger count = 0; '을 사용하고 테스트를 통과 할 때 내부 값을 증가시킨다. 배열을 만드는 것보다 효율적입니다. NSIndexSet을 만드는 것보다 더 효율적인지 여부는 테스트를 통해서만 해결할 수 있습니다 (__block에 오버 헤드가 있고 NSIndexSet이 매우 저렴함). – bbum

+0

+1 이것은 스택 오버플로가 허용 된 것 이외의 복수 응답을 허용하는 이유입니다. –

0

It's faster to use a for loop :

NSLog(@"%lu", (unsigned long)[self countSectionsWithValue:@"1" atIndex:4]); 
    // ... 
} 

// ... 

- (NSUInteger) countSectionsWithValue:(NSString *)value atIndex:(NSInteger)idx 
{ 
    NSUInteger count = 0 
    for (id section in _sections) 
    { 
     if ([[section objectAtIndex:idx] isEqualToString:value]) 
     { 
      count++; 
     } 
    } 
    return count; 
} 

NSLog에는 적절한 %lu 형식과 (unsigned long) 형식을 사용합니다. %d은 설명이 아니며 doesn't act the same in all scenarios입니다.