하위 배열이 조건을 충족시키는 배열에서 개수를 원합니다. 나는이 일을 할 수 있다고 생각했지만 할 수는 없었다.조건부 nsarray 개수
NSLog(@"%d",[[_sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[[obj objectAtIndex:4] isEqualToString:@"1"];
}] count]);
하위 배열이 조건을 충족시키는 배열에서 개수를 원합니다. 나는이 일을 할 수 있다고 생각했지만 할 수는 없었다.조건부 nsarray 개수
NSLog(@"%d",[[_sections enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[[obj objectAtIndex:4] isEqualToString:@"1"];
}] count]);
enumerateObjectsUsingBlock:
아무 것도 반환하지 않습니다. 그 코드는 컴파일되지 않을 것입니다. (그리고 주석이 말한 것처럼 자동 완성 기능이 작동하지 않습니다.
NSArray의 indexesOfObjectsPassingTest:
을 사용하고 의 count
을 사용하십시오.
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와)
상세 검색; 블록 외부에서'__block NSUInteger count = 0; '을 사용하고 테스트를 통과 할 때 내부 값을 증가시킨다. 배열을 만드는 것보다 효율적입니다. NSIndexSet을 만드는 것보다 더 효율적인지 여부는 테스트를 통해서만 해결할 수 있습니다 (__block에 오버 헤드가 있고 NSIndexSet이 매우 저렴함). – bbum
+1 이것은 스택 오버플로가 허용 된 것 이외의 복수 응답을 허용하는 이유입니다. –
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입니다.
작동하지 않는 기능은 무엇입니까? 결과는 무엇이며, 입력 데이터는 무엇입니까? – pmdj
코드 자동 완성에 카운트가 표시되지 않고 "잘못된 수신자 유형 'void'"가 표시됩니다. – Darren