2009-09-25 17 views
27

Ich habe zwei NSArrays, was ich zu tun suche ist, zwei Arrays zu vergleichen, die Strings enthalten, finden die Ähnlichkeiten und erstellen das erste Array wieder, aber so haben sie keine Ähnlichkeiten.Vergleichen von zwei Arrays

Nur für ein Beispiel etwas wie.

Zwei Arrays:

NSArray *arrayOne = [NSArray arrayWithObjects:@"TD1", @"TD2", @"TD3", nil]; 
NSArray *arrayTwo = [NSArray arrayWithObjects:@"Blah", @"String", @"TD2", nil]; 

Ergebnis:

NSArray *arrayOne = [NSArray arrayWithObjects:@"TD1", @"TD2", @"TD3", nil]; 

NSArray *arrayOneCopy = [NSArray arrayWithObjects:@"TD1", @"TD3", nil]; 
NSArray *arrayTwo = [NSArray arrayWithObjects:@"Blah", @"String", @"TD2", nil]; 

Antwort

56
NSMutableArray *arrayOneCopy = [NSMutableArray arrayWithArray:arrayOne]; 
[arrayOneCopy removeObjectsInArray:arrayTwo]; 
28

Verwendung NSMutableSet:

NSMutableSet *setOne = [NSMutableSet setWithArray: arrayOne]; 
NSMutableSet *setTwo = [NSMutableSet setWithArray: arrayTwo]; 

[setOne minusSet: setTwo]; 

NSArray *arrayOneResult = [setOne allObjects]; 

(streng genommen nicht setTwo nicht wandelbar sein müssen, können auch einsein(was besser funktioniert))

Oder verwenden Sie NSArray, wie die andere Person antwortete - das funktioniert auch.

Welcher funktioniert, hängt vollständig von Ihrer Datensatzgröße ab. Bei kleinen Datensätzen funktioniert die Array-Lösung einwandfrei. Bei größeren Mengen ist NSSet sehr viel effizienter, da Mitgliedschaftstests eine Hash-Prüfung und keine lineare Suche sind.

Messen und verwenden Sie das Gerät, das am besten funktioniert.

+0

Wenn die Reihenfolge der Elemente in der Anordnung wichtig ist, dann würde ich denke, man die verwenden andere Lösung mit NSArray, oder? –

+0

Gute Antwort, aber wie du gesagt hast, verwende ich nur kleine Datenmengen, also werde ich die andere Lösung verwenden. Danke trotzdem! – Joshua

+0

Yup-- für kleine Datensätze, "Newacct" ist die Antwort der Weg zu gehen. – bbum

3
- (NSInteger)countOfDifferentObjects:(NSArray *)anotherArray { 

    NSSet * s = [NSSet setWithArray:self]; 
    NSMutableSet * s1 = [NSMutableSet setWithSet:s]; 
    NSSet * s2 = [NSSet setWithArray:anotherArray]; 

    [s1 unionSet:s2]; 
    [s1 minusSet:s]; 
    return [s1 count]; 
} 

Dadurch wird die Anzahl der verschiedenen Objekte zwischen zwei Arrays zurückgibt (Vergleich mit isEqual)

array1 = @"A", @"B", @"C" 
array2 = @"B", @"D", @"Z" 
returns 2 (D and Z are different) 
Verwandte Themen