2012-07-14 379 views
2

我想根據它們的長度過濾出一個字符串數組。一般來說,我完全不熟悉Objective C和OOP。NSMutableArray removeObjectAtIndex用法

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]); 
} 

NSLog在else語句中只輸出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

好吧,這是有道理的。我嘗試在if長度!= 6語句中添加一個x--,這也適用。既然我在學習,我會用你的方法,但出於好奇,x有什麼問題嗎? – user1418214 2012-07-14 19:35:33

+0

@ user1418214添加'x - '沒有什麼問題,但更典型的解決方案是使用'while'代替for',並將'x ++'增量放入'else'分支。 – dasblinkenlight 2012-07-14 19:40:29

+0

使用謂詞方法,'NSDictionary * binding'部分如何影響程序? – user1418214 2012-07-14 19:46:05

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]; 
相關問題