-3
  (
    {
            color = blue;
    },
    {
            color = blue;
    },
    {
            color = red;
    },
    {
            color = white;
    }
 ) 

这是一个字典数组,我必须从与键颜色对应的数组中删除重复的字典。

4

4 回答 4

4

工作代码:

NSArray *html = @[@{@"color": @("blue")},@{@"color": @("blue")},@{@"color": @("red")},@{@"color": @("yellow")}];
NSMutableArray *finalArray = [NSMutableArray array];
NSMutableSet *mainSet = [NSMutableSet set];
for (NSDictionary *item in html) {
    //Extract the part of the dictionary that you want to be unique:
    NSDictionary *dict = [item dictionaryWithValuesForKeys:@[@"color"]];
    if ([mainSet containsObject:dict]) {
        continue;
    }
    [mainSet addObject:dict];
    [finalArray addObject:item];
}
NSLog(@"%@", finalArray);
于 2013-06-29T10:26:53.243 回答
4

NSSet就是在这种情况下救你。利用:

NSSet *set = [NSSet setWithArray:duplicateArray];
NSArray *uniqueArray = [set allObjects];

避免为此使用循环,因为如果您有更多对象循环是一个消耗过程。您可以直接使用NSSet,它肯定会工作。

于 2013-06-29T11:33:44.967 回答
2

Vin 的解决方案的替代方案,我相信它会起作用。但这不会创建结果数组。它操纵现有的。为此,它会创建临时副本来驱动迭代。

NSArray workingCopy = [NSArray arrayWithArray:yourArray];

for (int i = 0; i < [workingCopy count] - 1; i++) { // count - 1 just saves time. Works nicely without.

  for (int j = i+1; j < [workingCopy count]; j++) {

    if ([[[workingCopy objectAtIndex:i] objectForKey:@"color"] isEqualToString: [[workingCopy objectAtIndex:j] objectForKey:@"color"]] {

       [yourArray removeOjbect:[[workingCopy objectAtIndex:i] objectForKey:@"color"]] // yourArray must be mutable for this. 
    }      
  }
}

该算法之前创建了原始数组的副本。这是为了避免对用于迭代/枚举的数组进行更改。然后它通过避免将同一对象与自身进行比较(i 永远不等于 j)在二维循环中迭代副本,并且当 B 已经与 A 进行比较时,它避免将 A 与 B 比较。两者都是通过声明j 循环 i+1。最后一次迭代将是i = [workingCopy count]. Thenj会从 开始i+1,因此已经大于[workingCopy count]。循环的主体不会被执行一次。这就是为什么i循环已经可以用[workingCopy count] - 1.

没有原始数组的副本也可以实现相同的目的。但这确实需要对运行中的 idice i 和 j 进行相当智能的操作,这不是好的编程风格,相当复杂且容易出错。

于 2013-06-29T19:37:57.567 回答
-1

如果 arr 是要从中删除重复项的数组

for(int index = 0;index<arr.count;index++){
    NSDictionary *dict = [arr objectAtIndex:index];
    for(int i = index-1 ; i>=0 ;i++){
        NSDictionary *dictToComp = [arr objectAtIndex:i];
        if([[dict objectForKey:@"color"] isEqualToString:[dictToComp objectForKey:@"color"]]){
            [arr removeObject:dict];
        }
    }
}
于 2013-06-29T10:17:49.210 回答