2012-07-14 4 views
2

길이에 따라 문자열 배열을 필터링하려고합니다. 나는 Objective C와 OOP에 대해 전반적으로 완전히 새로운 것이다.NSMutableArray removeObjectAtIndex usage

wordList=[[stringFile componentsSeparatedByCharactersInSet:[NSCharacterSetnewlineCharacterSet]] mutableCopy]; 
for (int x=0; x<[wordList count]; x++) { 
    if ([[wordList objectAtIndex:x] length] != 6) { 
     [wordList removeObjectAtIndex:x]; 
    }else { 
     NSLog([wordList objectAtIndex:x]); 
    } 
} 

for (int x=0; x<[wordList count]; x++) { 
    NSLog([wordList objectAtIndex:x]); 
} 

else 문의 NSLog는 6 자 단어 만 출력하지만 두 번째 NSLog는 전체 배열을 출력합니다. 내가 여기서 무엇을 놓치고 있니? 또한 코드를 정리/개선 할 수있는 일반적인 포인터가 좋습니다.

답변

2

코드의 문제는 인덱스 x에서 항목을 제거하고 다음 색인 x++으로 이동할 때 x+1에 있던 항목은 검사되지 않습니다.

변경 가능한 배열을 필터링하는 가장 좋은 방법은 filterUsingPredicate: 메서드를 사용하는 것입니다. 여기 당신이 그것을 사용하는 방법입니다 : 당신이 어떤 느낌에 따라

wordList=[[stringFile 
    componentsSeparatedByCharactersInSet:[NSCharacterSetnewlineCharacterSet]] 
    mutableCopy]; 
[wordList filterUsingPredicate: 
    [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary * bindings) { 
     return [evaluatedObject length] == 6; // YES means "keep" 
    }]]; 
+0

좋습니다. 나는 x--를 if 길이에 추가하려고 시도했다! = 6 문장. 내가 배우는 동안 너의 방법을 사용 하겠지만, 호기심에서, x에 문제가 있는게 있니? – user1418214

+0

@ user1418214'x -'를 추가해도 아무런 문제가 없겠지만 좀 더 일반적인 해결책은'for' 대신'while' 루프를 사용하고'else' 브랜치에'x ++'증가분을 넣는 것입니다 . – dasblinkenlight

+0

술어 메소드를 사용하면 'NSDictionary * binding'부분이 프로그램에 어떤 영향을 줍니까? – user1418214

3

당신이 술어 배열을 필터링하거나 배열을 반복하고 개체를 제거 할 수 중 하나를 이해하기 가장 쉬운 방법입니다. 이해하고 유지하는 것이 가장 쉬운 방법을 선택해야합니다. 술어를

술어를 사용하여

필터는 필터 배열 또는 세트의 아주 간결한 방법입니다하지만 당신의 배경에 따라 그들이 사용하는 이상한 느낄 수 있습니다. 그것을 열거하는 동안 당신은 배열을 수정할 수 없습니다 열거하고

을 제거

NSMutableArray * wordList = // ... 
[wordList filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
    NSString *word = evaluatedObject; 
    return ([word length] == 6); 
}]]; 

을하지만 당신은 당신이 제거하고 그들을 모두 제거하고 싶은 모든 항목의 메모를 할 수 있습니다 :이처럼 배열을 필터링 할 수 있습니다 다음과 같이 배열 전체를 열거 한 후 일괄 처리 :

NSMutableArray * wordList = // ... 
NSMutableIndexSet *indicesForObjectsToRemove = [[NSMutableIndexSet alloc] init]; 
[wordList enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    NSString *word = obj; 
    if ([word length] != 6) [indicesForObjectsToRemove addIndex:idx]; 
}]; 
[wordList removeObjectsAtIndexes:indicesForObjectsToRemove];