(
{
color = blue;
},
{
color = blue;
},
{
color = red;
},
{
color = white;
}
)
这是一个字典数组,我必须从与键颜色对应的数组中删除重复的字典。
答案 0 :(得分: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);
答案 1 :(得分:4)
NSSet
可以帮您解决问题。使用:
NSSet *set = [NSSet setWithArray:duplicateArray];
NSArray *uniqueArray = [set allObjects];
避免使用循环,因为如果你有更多的对象循环是一个消耗过程。您可以直接使用NSSet
,它肯定会有效。
答案 2 :(得分: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.
}
}
}
此算法之前创建了原始数组的副本。这是为了避免对用于迭代/枚举的数组进行更改。然后它通过避免将同一个对象与自身进行比较来迭代二维循环中的副本(我永远不会满足j),并且当B已经与A进行比较时,它避免了将A与B进行比较。两者都是通过声明j循环与i + 1。
最后一次迭代是i = [workingCopy count]
。然后,j
将从i+1
开始,因此已经大于[workingCopy count]
。循环的主体不会被执行一次。这就是i
循环已经完成[workingCopy count] - 1
的原因。
没有原始数组的副本就可以实现同样的目的。但这确实需要对运行的id和j进行相当智能的操作,这不是一种好的编程风格,相当复杂且容易出错。
答案 3 :(得分:-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]; } } }