比较具有相同值但具有不同顺序的两个数组

时间:2013-03-29 18:45:37

标签: objective-c nsarray

我有2个nsarray,具有相同的值,但顺序不同。

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

我需要一种方法来确定两个数组是否具有不同顺序的相同值。

有点

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

5 个答案:

答案 0 :(得分:19)

您可以将NSCountedSet用于此目的:

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

NSCountedSet是不同对象的集合,其中每个对象都有一个关联的计数器。因此

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

YES,但

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

结果为NO

答案 1 :(得分:5)

更新:如果数组有重复的元素,这将无效!

你可以用这些数组创建两个NSSet并比较它们。

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");

答案 2 :(得分:4)

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

答案 3 :(得分:0)

完全没有元素。有一个柜台。并将双'for循环'解析为彼此的每个元素。在每次匹配时递增计数器。 注意:当所有元素都是唯一的时,这是有效的。

如果不同或您不知道,请对它们进行排序并一对一匹配。

答案 4 :(得分:0)

另一种方法是使用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;
}

请注意,NSHashTable需要iOS 6 +