-1

我正在寻找从objective-C中的多维数组中删除重复对象的最佳解决方案(Swift也很好),如下所示:

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

我们是否有任何来自 NSOrderedSet/NSMutableArray 的算法或解决方案支持我们尽可能地在没有循环/减少循环的情况下执行此操作?

这是删除所有数组中所有重复项的预期结果:

mutilDemensionArray = @[
                                 @[@"1", @"2", @"3", @"4",],
                                 @[@"11", @"13", @"24", @"14",],
                                 @[@"21",],
                                 ];
  • 如果我们有很多重复的对象,那么保留第一个并删除其他对象。
  • 我不关心子数组中对象的顺序,只关心子数组的顺序。
4

4 回答 4

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);
于 2016-06-10T05:43:57.723 回答
1

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

  • 首先将每个子数组转换为一个集合,这将删除该数组中的重复项。

  • 然后,减去已经看过的项目集。

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

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

就像是:

-(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];
 }
于 2016-06-10T06:16:17.340 回答
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))
于 2016-06-10T05:38:15.583 回答
1

如果您的数组是NSArray可变的,请使用此代码,

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

如果您的 Array 是NSMutableArray可变的,请使用此单行代码,

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

希望它有帮助

于 2016-06-10T06:25:03.980 回答