Compare two arrays with the same value but with a different order

泪湿孤枕 提交于 2019-11-26 14:38:12

问题


I have 2 nsarray, with the same values but in different order.

NSArray * array1 = {0,1,2,3}
NSArray * array2 = {2,3,1,0}

I need a method to determinate if two arrays have the same values in a different order.

Kind of

-(BOOL) isSameValues:(NSArray*)array1 and:(NSArray*)array2;

回答1:


if ([[NSSet setWithArray:array1] isEqualToSet:[NSSet setWithArray:array2]]) {
    // the objects are the same
}



回答2:


You can use NSCountedSet for that purpose:

- (BOOL)isSameValues:(NSArray*)array1 and:(NSArray*)array2
{
    NSCountedSet *set1 = [NSCountedSet setWithArray:array1];
    NSCountedSet *set2 = [NSCountedSet setWithArray:array2];
    return [set1 isEqualToSet:set2];
}

NSCountedSet is a collection of different objects, where each object has an associated counter with it. Therefore the result for

NSArray *array1 = @[@0,@1,@2,@3];
NSArray *array2 = @[@2,@3,@1,@0];

is YES, but for

NSArray *array1 = @[@1,@1,@3,@3];
NSArray *array2 = @[@3,@3,@3,@1];

the result is NO.




回答3:


Update: this will not work if arrays have duplicate elements!

You could create two NSSets with those arrays and the compare them.

NSArray * array1 = @[@0,@1,@2,@3];
NSArray * array2 = @[@2,@3,@1,@0];

NSSet *set1 = [NSSet setWithArray:array1];
NSSet *set2 = [NSSet setWithArray:array2];

NSLog(@"result %@", [set1 isEqualToSet:set2] ? @"YES" : @"NO");



回答4:


Take total no of elements. Have a counter. And put double 'for loop' to parse through each and every element of each other. Increment the counter at each matching. Note : This is valid when all elements are unique.

If different or you don't know, sort them and match one to one.




回答5:


An other way would be to use a NSHashTable.

- (BOOL)array:(NSArray *)array1 containsTheSameObjectsAsArray:(NSArray *)array2 {
    if (array1.count != array2.count) {
        return NO;
    }
    NSHashTable *table = [[NSHashTable alloc] initWithOptions:NSHashTableWeakMemory 
                                                     capacity:array1.count];
    for (NSObject *object in array1) {
        [table addObject:object];
    }
    for (NSObject *object in array2) {
        if (![table containsObject:object]) {
            return NO;
        }
    }
   return YES;
}

Note that NSHashTable requires iOS 6+



来源:https://stackoverflow.com/questions/15709494/compare-two-arrays-with-the-same-value-but-with-a-different-order

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!