2013-03-29 7 views
6

Mam 2 nsarray, z tymi samymi wartościami, ale w innej kolejności.Porównaj dwie tablice o tej samej wartości, ale z inną kolejnością.

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

trzeba metodę zdeterminowaną jeśli dwie macierze mają takie same wartości w inna kolejność.

Rodzaju

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

sortuj je, a następnie powtarzaj i sprawdzaj, czy każdy element jest zgodny. –

Odpowiedz

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

Uznałoby to za równe '[@ 1, @ 2, @ 2]' i '[@ 1, @ 1, @ 2]'. –

5

Aktualizacja: to nie będzie działać, jeśli tablice mają zduplikowane elementy!

Można utworzyć dwa NSSet s z tymi tablicami i porównać je.

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

To by traktowało "[@ 1, @ 2, @ 2]" i "[@ 1, @ 1, @ 2]" jako równe. –

+0

Tak, masz rację, przykład OP wyrzucił mnie z –

+1

@MartinR: Nie jest jasne, czy to niewłaściwe zachowanie. Zawiera te same wartości. Jeśli liczba wystąpień jest istotna, po prostu ustaw ją jako NSCountedSet. – Chuck

0

Take całkowita liczba elementów. Mieć licznik. I umieść podwójną "pętlę for", aby przeanalizować każdy ze składników. Zwiększ licznik przy każdym dopasowaniu. Uwaga: Jest to ważne, gdy wszystkie elementy są unikatowe.

Jeśli jesteś inny lub nie wiesz, posortuj je i dopasuj jeden do jednego.

0

Innym sposobem byłoby użycie 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; 
} 

Zauważ, że NSHashTable wymaga iOS 6+

18

NSCountedSet Można użyć do tego celu:

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

NSCountedSet jest zbiorem różnych obiektów, gdzie każdy obiekt jest skojarzony z nim licznik . Dlatego wynik dla

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

jest YES, ale dla

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

wynik jest NO.

+0

Zastanawiam się, czy po prostu sortowanie tablic, a następnie porównywanie byłoby tej samej prędkości, lub potencjalnie szybciej? –

+0

@DmitryShevchenko: I * zakładam *, że wstawienie elementów tablicy do zliczanego zestawu (za pomocą metody 'hash' do identyfikacji identycznych elementów) jest szybsze niż faktyczne sortowanie wszystkich elementów (lub przynajmniej wolniejsze). Ale nie mogę ci powiedzieć na pewno. - W każdym razie działałoby to z tablicami arbitralnych elementów, które mogą nie być porównywalne. –

+2

to jest rzeczywiście właściwa odpowiedź –

Powiązane problemy