从多维可变数组中删除重复对象的最佳方法 objective-C
Best way to remove duplicate objects from multi dimension 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",],
];
- 如果我们有很多重复对象,那么保留第一个并删除其他对象。
- 我不关心子数组中对象的顺序,只关心子数组的顺序。
请试试这个,如果这能解决您的问题,请说一下
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))
请尝试以下代码。我已经测试过了。
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);
您可以使用 NSSet
的 属性,它们将只存储给定值的单个实例。
首先将每个子数组转换成一个集合,这将删除该数组中的重复项。
然后,减去已经看过的项目集
将结果转换回数组并将其添加到输出数组。
最后,将该子数组中的项目添加到已经看过的项目集中。
类似于:
-(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];
}
如果您的数组是 NSArray
变量,请使用此代码,
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:mutilDemensionArray];
mutilDemensionArray = [orderedSet array];
如果您的数组是 NSMutableArray
变量,请使用此单行代码,
[mutilDemensionArray addObjectsFromArray:[[NSSet setWithArray: mutilDemensionArray] allObjects]];
希望对您有所帮助
我正在寻找从 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",],
];
- 如果我们有很多重复对象,那么保留第一个并删除其他对象。
- 我不关心子数组中对象的顺序,只关心子数组的顺序。
请试试这个,如果这能解决您的问题,请说一下
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))
请尝试以下代码。我已经测试过了。
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);
您可以使用 NSSet
的 属性,它们将只存储给定值的单个实例。
首先将每个子数组转换成一个集合,这将删除该数组中的重复项。
然后,减去已经看过的项目集
将结果转换回数组并将其添加到输出数组。
最后,将该子数组中的项目添加到已经看过的项目集中。
类似于:
-(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];
}
如果您的数组是 NSArray
变量,请使用此代码,
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray:mutilDemensionArray];
mutilDemensionArray = [orderedSet array];
如果您的数组是 NSMutableArray
变量,请使用此单行代码,
[mutilDemensionArray addObjectsFromArray:[[NSSet setWithArray: mutilDemensionArray] allObjects]];
希望对您有所帮助