根据其值删除NSArray元素

时间:2013-04-22 23:13:33

标签: ios objective-c nsarray nsdictionary

我有一个NSDrray的NSDictionary值,他们的NSDictionay结构看起来像这样

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

我的数组中有十几个这样的元素,我想知道如何从NSArray中删除具有相同 SERIESID 的元素,或者如果在NSArray之后甚至可以这样做已经做好了。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分: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:,你就会遇到错误。这就是为什么我们建立一个我们想要删除的对象列表,然后在最后将它交给数组。)

答案 1 :(得分: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];
   } 
}

答案 2 :(得分:1)

创建NSMutableSet以包含SERIESID的已使用值。在数组中的每个字典中运行for循环。在遍历每个字典时,检查字典SERIESID键的对象。如果集合中尚未存在,请添加它。如果它已存在,则从阵列中删除该对象。当itteration结束时,对于SERIESID的每个值,数组中只有一个对象。请注意,显然这意味着具有唯一SERIESID的字典的第一个实例将是保留的字典,因此请确保在迭代数组之前将字典设置为可行的顺序。

如果您需要有关完成此操作所需的精确方法的更多特定信息,请查看documentation.