如何从IOS中的字典数组中删除重复性? [关闭]
Posted
技术标签:
【中文标题】如何从IOS中的字典数组中删除重复性? [关闭]【英文标题】:How to remove duplicity from array of dictionaries in IOS? [closed] 【发布时间】:2013-06-29 10:06:29 【问题描述】: (
color = blue;
,
color = blue;
,
color = red;
,
color = white;
)
这是一个字典数组,我必须从与键颜色对应的数组中删除重复的字典。
【问题讨论】:
只是为了澄清。这两个蓝色是同一对象的相同实例,还是恰好具有相同值的不同实例? 两者是具有相同值的不同对象,实际上很容易从简单数组中删除重复性,这里我遇到了问题,因为数组包含字典。 【参考方案1】:NSSet
在这种情况下是为了救你。使用:
NSSet *set = [NSSet setWithArray:duplicateArray];
NSArray *uniqueArray = [set allObjects];
避免为此使用循环,因为如果您有更多对象循环是一个消耗过程。您可以直接使用NSSet
,它肯定会工作。
【讨论】:
此方法仅适用于字典仅包含单个键(或具有相同颜色值的所有字典相互匹配)的情况。 @Wain 是正确的。看看我的回答:***.com/a/17379211/1603072。它适用于任意数量的键。 这也仅在两个“蓝色”对象引用相同实例时才有效。一个 NSSEt 可以很好地保存许多带有相同值的实例。 @Wain 和 @Vin 如果字典中有多个键,并且数组有两个具有相同键值的字典,NSSet
也可以工作,我认为这就是所谓的重复对象如果两个对象具有相同的值。
我刚刚检查过了,NSSet 真的很棒,我认为它不适用于字典数组。但确实如此,谢谢各位。 :)【参考方案2】:
工作代码:
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);
【讨论】:
【参考方案3】:我认为可以替代 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]
。那么j
将从i+1
开始,因此已经大于[workingCopy count]
。循环的主体不会被执行一次。这就是为什么i
循环可以用[workingCopy count] - 1
结束的原因。
同样可以在没有原始数组的副本的情况下实现。但这确实需要对正在运行的 idice i 和 j 进行相当智能的操作,这不是好的编程风格,相当复杂且容易出错。
【讨论】:
【参考方案4】:如果 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];
【讨论】:
那行不通有两个原因。首先,如果您不想弄乱数组索引,则必须将i++
更改为 i--
。 (如果你没有将它用作索引,那么你甚至不会得到一个 aboort 而是一个无限循环)。其次,通过从arr
本身中删除对象,您将弄乱您的算法,跳过迭代并最终导致非法的 idex 中止。以上是关于如何从IOS中的字典数组中删除重复性? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章