2016-06-10 77 views
-1

我正在寻找最佳的解决方案从像这样的一些数组中删除多维数组中的重复对象:从多维MutableArray中删除重复的对象的最佳方法objective-C

muliDemensionArray = @[ 
           @[@"1", @"2", @"3", @"4", @"4",], 
           @[@"11", @"13", @"24", @"14",], 
           @[@"1", @"3", @"24", @"21",], 
           ]; 

我们是否有任何算法或解决方案来自NSOrderedSet/NSMutableArray支持我们尽可能不使用循环/ reduce循环?

这是预期结果删除所有阵列所有重复:

mutilDemensionArray = @[ 
           @[@"1", @"2", @"3", @"4",], 
           @[@"11", @"13", @"24", @"14",], 
           @[@"21",], 
           ]; 
  • 如果我们有很多重复的对象,所以要第一个和删除等。
  • 我不关心子数组中对象的顺序,只关心子数组的顺序。
+1

你需要澄清的目标。你想从每个内部数组中删除重复项还是所有数组中的所有重复项?用期望的输出更新你的问题,并显示你到目前为止尝试过的。 – rmaddy

+0

可能的重复http://stackoverflow.com/questions/1025674/the-best-way-to-remove-duplicate-values-from-nsmutablearray-in-objective-c –

+0

谢谢,rmaddy。 这个问题不是从这个问题重复,迈克。 –

回答

1

您可以使用的属性,它们将只存储给定值的单个实例。

  • 首先将每个子数组转换为一个集合,这将删除该数组中的重复项。然后,减去已经看到的项目组。

  • 将结果转换回数组并将其添加到您的输出数组。

  • 最后,将该子数组中的项目添加到已经看过的项目集合中。

喜欢的东西:

-(NSArray *)removeDuplicatesFromArray:(NSArray *)array { 

    NSMutableArray *returnArray=[NSMutableArray new]; 
    NSMutableSet *cumulativeSet=[NSMutableSet new]; 

    for (NSArray *innerArray in array) { 
     NSMutableSet *innerSet = [NSMutableSet setWithArray:innerArray]; 
     [innerSet minusSet:cumulativeSet]; 
     [cumulativeSet unionSet:innerSet]; 

     [returnArray addObject:[innerSet allObjects]]; 
    } 

    return [returnArray copy]; 
} 
+0

谢谢,它真的帮助! –

1

请尝试这一点,并说,如果这可以解决你的目的

NSArray *multidimentionalArray = @[ 
           @[@"1", @"1",@"2",@"3",@"2"], 
           @[@"90", @"91",@"92",@"90",@"92"]]; 
NSMutableArray *mutableCopy = [multidimentionalArray mutableCopy]; 
for (NSArray *arr in multidimentionalArray) { 
    NSSet *s = [NSSet setWithArray:arr]; 
    [mutableCopy removeObject:arr]; 
    [mutableCopy addObject:[s allObjects]]; 
} 
multidimentionalArray = mutableCopy; 
NSLog(@"%@",multidimentionalArray); 
//((3,1,2), (92,91,90)) 
+0

谢谢,但删除交叉数组中的重复对象是我正在寻找的东西。 –

+0

枚举时您无法从阵列/结构中删除 –

1

请尝试以下代码。我已经测试过它。

NSArray *muliDemensionArray = @[ 
           @[@"1", @"2", @"3", @"4", @"4", @"6", @"7", @"7", @"9", @"10", @"11", @"12"], 
           @[@"11", @"13", @"24", @"14", @"16", @"16", @"17", @"18", @"19", @"20", @"21", @"22"], 
           @[@"1", @"3", @"24", @"21", @"31", @"312", @"412"], 
           @[@"23", @"42", @"32", @"41", @"424", @"55", @"123", @"54", @"123"], 
           @[@"132", @"123", @"123", @"412", @"41", @"1", @"2", @"4", @"5", @"6", @"31"], 
           ]; 


NSMutableArray *newArray = [NSMutableArray new]; 
NSMutableArray *tempArr = [NSMutableArray new]; 

for (int i = 0; i<muliDemensionArray.count;i++) { 

     NSArray *indexArray = [muliDemensionArray objectAtIndex:i]; 

     NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:indexArray]; 
     indexArray = [orderedSet array]; 

     NSMutableArray *arr1 = [NSMutableArray new]; 

     for (NSString *str in indexArray) { 
      if (![tempArr containsObject:str]) { 

       [arr1 addObject:str]; 

      } 
     } 
     [tempArr addObjectsFromArray:indexArray]; 
     [newArray addObject:arr1]; 


} 

NSLog(@"%@",newArray); 
+0

谢谢。它工作正常,但我们必须运行循环双打。 –

1

如果阵列是NSArray变量使用此代码,

NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:mutilDemensionArray]; 
mutilDemensionArray = [orderedSet array]; 

如果阵列是NSMutableArray变量使用这个单行代码,

[mutilDemensionArray addObjectsFromArray:[[NSSet setWithArray: mutilDemensionArray] allObjects]]; 

希望它的帮助