如何从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中的字典数组中删除重复性? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

iOS数组的去重,判空,删除元素,删除重复元素 等

如何从二维数组中删除重复项? [关闭]

如何通过名称值从数组中删除字典元素[重复]

从 C++ 中的数组中删除重复项 [关闭]

如何从字典中的列表中删除元素[重复]

如何根据ios中的特定键从数组中获取字典