2009-10-30 19 views
21

Możliwa powielać: comparing-two-arraysObjective-C - Jak porównać tablice i wyodrębnić różnicę?

Mam dwie NSArray i chciałabym utworzyć nową tablicę z przedmiotami z drugiego szeregu, ale nie zawarte w pierwszej tablicy.

Example: 

NSMutableArray *firstArray = [NSMutableArray arrayWithObjects:@"Bill", @"Ben", @"Chris", @"Melissa", nil]; 
NSMutableArray *secondArray = [NSMutableArray arrayWithObjects:@"Bill", @"Paul", nil]; 

The resulting array should be: 

[@"Paul", nil]; 

Rozwiązałem ten problem podwójną pętlą porównując obiekty do wewnętrznej.

Czy istnieją lepsze rozwiązania?

Odpowiedz

93
[secondArray removeObjectsInArray:firstArray]; 

Idea ta została podjęta z another answer.

10

Jeśli zduplikowane elementy są nie istotne w tablicach, można użyć operacji minusSet: z NSMutableSet:

NSMutableArray *firstArray = [NSMutableArray arrayWithObjects:@"Bill", @"Ben", @"Chris", @"Melissa", nil]; 
NSMutableArray *secondArray = [NSMutableArray arrayWithObjects:@"Bill", @"Paul", nil]; 

NSSet *firstSet = [NSSet setWithArray:firstArray]; 
NSMutableSet *secondSet = [NSMutableSet setWithCapacity:[secondArray count]]; 
[secondSet addObjectsFromArray:secondArray]; 

[secondSet minusSet:firstSet]; // result is in `secondSet` 
+2

Jest to niemożliwe. Dokumenty Apple mówią, że minusSet jest typu pustego. – Adam

+2

poprawny kod ostatniej instrukcji to po prostu "[secondSet minusSet: firstSet];" który wykonuje odejmowanie. Wynik nie jest zwracany, a raczej jest operacją na obiekcie secondSet. Jeśli jest to podprogram, wówczas "zwrócisz drugi zestaw"; –

0

Chcę porównać obrazy z dwóch NSArray. One Array, otrzymywałem od Core Database. Po drugie mam stałe obiekty tablicowe.

Chcę wiedzieć, że obiekt drugiej tablicy jest obecny w bazie danych Core, czy nie.

Oto kod, którego użyłem.

// All object from core data and take into array. 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]initWithEntityName:@"student"]; 

NSArray *dbresult = [[NSArray alloc]init]; 
NSError *error; 
@try { 
    dbresult = [context executeFetchRequest:fetchRequest error:&error]; 
} 
@catch (NSException *exception) { 
    NSString *logerror = [NSString stringWithFormat:@"error in fetching Rooms from coredata = %@",exception.description]; 
NSLog(logerror) 
} 
@finally { 
} 

/* 
Get Unused images from list 
*/ 

NSMutableArray *usedImages = [dbresult valueForKey:@"roomImageLocalPath"]; 

NSMutableSet *fSet = [NSMutableSet setWithArray:usedImages]; 
NSMutableSet *sSet = [NSMutableSet setWithCapacity:[newImages count]]; 
[sSet addObjectsFromArray:newImages]; 
[sSet minusSet:fSet]; 

NSArray *unusedImages = [secondSet allObjects]; 
NSLog(@"unusedImages %@",unusedImages); 
Powiązane problemy