Лучший способ удалить повторяющиеся объекты из многомерного MutableArray objective-C

Я ищу лучшее решение для удаления повторяющихся объектов из многомерного массива в 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",],
                                 ];
  • Если у нас много повторяющихся объектов, оставьте первый и удалите другие.
  • Меня не волнует порядок объектов в субмассивах, я просто забочусь о порядке субмассивов.

person Tony TRAN    schedule 10.06.2016    source источник
comment
Вам нужно уточнить цель. Вы хотите, чтобы дубликаты были удалены из каждого внутреннего массива или все дубликаты во всех массивах? Обновите свой вопрос, указав ожидаемый результат и покажите, что вы пробовали до сих пор.   -  person rmaddy    schedule 10.06.2016
comment
возможный дубликат stackoverflow.com/questions/1025674/   -  person Prashant Tukadiya    schedule 10.06.2016
comment
Спасибо, мэдди. Этот вопрос не дублирует тот вопрос, Майк.   -  person Tony TRAN    schedule 10.06.2016
comment
Опять же, покажите то, что вы уже пробовали. И объясните, как вы пришли к такому результату. Почему, например, из первого массива была удалена 1, а не из третьего.   -  person rmaddy    schedule 10.06.2016
comment
ваш подмассив будет изменчивым или неизменным?   -  person Saheb Roy    schedule 10.06.2016
comment
Все подмассивы изменяемы, Сахеб.   -  person Tony TRAN    schedule 10.06.2016


Ответы (4)


Вы можете использовать свойство 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];
 }
person Paulw11    schedule 10.06.2016
comment
Спасибо, действительно помогло! - person Tony TRAN; 10.06.2016

Пожалуйста, попробуйте это и скажите, поможет ли это вашей цели

 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))
person Saheb Roy    schedule 10.06.2016
comment
Спасибо, но я ищу удаление повторяющихся объектов в кросс-массиве. - person Tony TRAN; 10.06.2016
comment
вы не можете удалить из массива / структуры при перечислении - person Saheb Roy; 10.06.2016

Пожалуйста, попробуйте следующий код. Я это проверил.

   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);
person Fawad Masud    schedule 10.06.2016
comment
Спасибо. Он работает нормально, но мы должны запускать удвоения цикла. - person Tony TRAN; 10.06.2016

Если ваш массив - это NSArray переменная, используйте этот код,

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

Если ваш массив - это NSMutableArray переменная, используйте этот однострочный код,

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

надеюсь, что это поможет

person Iyyappan Ravi    schedule 10.06.2016