2013-04-22 67 views
0

刪除NSArray的元素我有他們NSDictionay結構看起來像這樣根據其價值

ID = 22; 
SERIESID = 33; 
YEAREND = 2002; 
YEARSTART = 1996; 

我有十幾個在我的陣列,這些元素的NSDictionary的NSArray的價值觀,我想知道如何從NSArray中刪除具有相同SERIESID的元素,或者在已經創建了NSArray後,甚至可以刪除這些元素。

任何幫助,將不勝感激。

+3

好首先,你應該只從*** NSMutableArray ***中刪除對象,而不是不可變的NSArray。 – 2013-04-22 23:15:10

+0

你的問題不太清楚。 「從NSArray中刪除具有相同SERIESID的元素」?你說'NSMutableArray'包含這些字典。你是說如果數組中的多個字典中存在相同的值? – 2013-04-22 23:17:40

+0

好點...可以改變:P運氣:) – HurkNburkS 2013-04-22 23:17:52

回答

3

基本上,遍歷數組,跟蹤所看到的SERIESID,並且如果當前元素的SERIESID是重複的,則將其標記爲刪除。

像這樣:

NSMutableSet *seen = [NSMutableSet set]; 
NSMutableIndexSet *toDelete = [NSMutableIndexSet indexSet]; 
[yourArray enumerateObjectsUsingBlock:^(id dict, NSUInteger i, BOOL *stop) { 
    if ([seen containsObject:dict[@"SERIESID"]]) { 
     [toDelete addIndex:i]; 
    } else { 
     [seen addObject:dict[@"SERIESID"]]; 
    } 
}]; 
[yourArray removeObjectsAtIndexes:toDelete]; 

(作爲一個方面說明,你就必須做刪除,即使它是不是最直觀的方法這樣的NSMutableArray的目的不是要改變的同時。你正在循環中,所以如果你只是在你的循環中嘗試使用removeObjectAtIndex:就會出錯,這就是爲什麼我們要建立一個我們想要刪除的對象列表,然後在最後把它交給數組)

+0

哈哈,偉大的思想家都一樣。看起來你設法按下返回按鈕的速度更快。 :)使用枚舉。 – 2013-04-22 23:38:17

+0

好吧,現在就試試這個吧..我會讓你知道我怎麼去吃點東西,所以可能需要30分鐘左右。 – HurkNburkS 2013-04-22 23:39:19

+0

y這工作得很好..對不起,遲到的回覆在這一切中間吃過午飯,幾乎忘了回去lol – HurkNburkS 2013-04-23 00:57:32

1

創建一個NSMutableSet以包含使用的SERIESID的值。在陣列中的每個字典中運行for循環。在遍歷每個字典時,檢查字典的SERIESID鍵的對象。如果它尚未出現在集合中,請添加它。如果它已經存在,則從陣列中刪除該對象。當迭代完成時,對於SERIESID的每個值,數組中只有一個對象。請注意,這顯然意味着具有唯一SERIESID的字典的第一個實例將保留,因此在迭代數組之前,請確保您有可用的字典。

如果你需要做到這一點需要精確的方法更具體的信息,請查看documentation.

2

我沒有測試過這一點,但你可以做一些與此類似:

NSMutableArray *seriesHolder = [NSMutableArray alloc]init]; 

for(NSMutableDictionary *dict in yourMutableArray) 
{ 
    NSString *seriesID = [dict objectForKey:@"SERIESID"]; 

    if(![seriesHolder containsObject:seriesID]) 
    { 
    [seriesHolder addObject:seriesID]; 
    } 
    else 
    { 
    [yourMutableArray removeObject:dict]; 
    } 
} 
+0

這會起作用,但我會指向@查克的回答。這正是「NSSet」的原因,而不是陣列。 – 2013-04-22 23:39:41

+0

是的好電話,這是一個超級乾淨的答案 – 2013-04-22 23:40:33