7

同じ値ですが順序が異なる 2 つの nsarray があります。

NSArray * 配列 1 = {0,1,2,3}
NSArray * 配列 2 = {2,3,1,0}

2 つの配列が同じ値を異なる順序で持っているかどうかを判断するメソッドが必要です。

すこし

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

5 に答える 5

20

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です。

于 2013-03-29T19:29:35.477 に答える
5

更新:配列に重複する要素がある場合、これは機能しません!

これらの配列を使用して 2 つの を作成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");
于 2013-03-29T18:47:32.243 に答える
4
if ([[NSSet setWithArray:array1] isEqualToSet:[NSSet setWithArray:array2]]) {
    // the objects are the same
}
于 2013-03-29T18:48:52.393 に答える
0

要素の総数を取ります。カウンターをどうぞ。そして、二重の「forループ」を配置して、互いのすべての要素を解析します。一致するたびにカウンターをインクリメントします。注 : これは、すべての要素が一意である場合に有効です。

違う場合やわからない場合は、並べ替えて 1 対 1 で一致させてください。

于 2013-03-29T18:54:34.647 に答える
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;
}

NSHashTableiOS 6 以降が必要であることに注意してください

于 2013-03-29T18:57:28.470 に答える