如何从IOS中的字典数组中删除重复?

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

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

NSSet在这种情况下是为了节省你的。 使用:

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

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

工作代码:

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

Vin的解决scheme,我相信会工作的替代。 但是这个不会创build一个结果数组。 它操纵现有的。 为此,它会创build临时副本来驱动迭代。

 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. } } } 

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

没有原始数组的副本就可以实现相同的function。 但是这确实需要相当聪明的操作id和i,这不是一个好的编程风格,相当复杂和容易出错。

如果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]; } } }