2

我正在尝试根据字符串的长度过滤掉一个字符串数组。一般来说,我对 Objective C 和 OOP 完全陌生。

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 输出的是整个数组。我在这里想念什么?此外,任何清理/改进代码的通用指针都值得赞赏。

4

2 回答 2

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];
于 2012-07-14T19:39:27.653 回答
2

您的代码的问题在于,当您删除 index 处的项目x并移至下一个 indexx++时,x+1永远不会检查所在的项目。

过滤可变数组的最佳方法是使用该filterUsingPredicate:方法。以下是你如何使用它:

wordList=[[stringFile
    componentsSeparatedByCharactersInSet:[NSCharacterSetnewlineCharacterSet]]
    mutableCopy];
[wordList filterUsingPredicate:
    [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary * bindings) { 
        return [evaluatedObject length] == 6; // YES means "keep"
    }]];
于 2012-07-14T19:25:02.350 回答