同じ値ですが順序が異なる 2 つの nsarray があります。
NSArray * 配列 1 = {0,1,2,3}
NSArray * 配列 2 = {2,3,1,0}
2 つの配列が同じ値を異なる順序で持っているかどうかを判断するメソッドが必要です。
すこし
-(BOOL) isSameValues:(NSArray*)array1 and:(NSArray*)array2;
同じ値ですが順序が異なる 2 つの nsarray があります。
NSArray * 配列 1 = {0,1,2,3}
NSArray * 配列 2 = {2,3,1,0}
2 つの配列が同じ値を異なる順序で持っているかどうかを判断するメソッドが必要です。
すこし
-(BOOL) isSameValues:(NSArray*)array1 and:(NSArray*)array2;
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
です。
更新:配列に重複する要素がある場合、これは機能しません!
これらの配列を使用して 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");
if ([[NSSet setWithArray:array1] isEqualToSet:[NSSet setWithArray:array2]]) {
// the objects are the same
}
要素の総数を取ります。カウンターをどうぞ。そして、二重の「forループ」を配置して、互いのすべての要素を解析します。一致するたびにカウンターをインクリメントします。注 : これは、すべての要素が一意である場合に有効です。
違う場合やわからない場合は、並べ替えて 1 対 1 で一致させてください。
別の方法は、を使用すること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 以降が必要であることに注意してください