2013-07-12 4 views
6

Desidero confrontare 2 NSMutableArray e ottenere oggetto diverso nel terzo Array. Come lo posso fare ?Confrontare 2 nsmutablearray e ottenere oggetti diversi nel terzo array in ios

Oggetto loop loop Array1.

Array1 = "a", "b","c","d","a","b","c"; 
Array2 = "a", "b", "c"; 

E poi risultare

Array3 = "d"; 

Grazie in anticipo

+0

Dovrei array3 essere solo '[ "d"]', o dovrebbe essere '[ "b", "d"] ', la tua domanda non è chiara su cosa significhi 'oggetto diff'? – Wain

+0

Le stringhe degli oggetti sono? Inoltre, stai cercando l'uguaglianza (il valore è lo stesso) o identità (che oggetti in array1 occupano la stessa memoria degli oggetti in array2)? – Maarten

+0

@Wain: ho modificato la mia domanda – NGOT

risposta

20

utilizzare i set per le operazioni di set:

NSSet *set1 = [NSSet setWithArray:array1]; 
NSMutableSet *set2 = [NSMutableSet setWithArray:array2]; 
[set2 minusSet:set1]; 
+1

+1 @NGOT utilizzando NSSet è efficiente. –

+0

Provo sopra il codice ma nella console set2 sempre = 0 – NGOT

+0

@NGOT, stai usando veramente stringhe letterali come nella domanda, o alcuni oggetti di una classe personalizzata? – vikingosegundo

5
NSMutableArray *gotDiffArry= [[NSMutableArray alloc] init]; 
for(int i = 0 ; i < FirstArray.count; i++) { 
    if(i < seconArray.count){ 
     if(![seconArray[i] isEqual:firstArray[i]]){ 
      [gotDiffArry addObject:[NSNumber numberWithInt:i]]; 
     } 
    } else { 
     [gotDiffArry addObject:[NSNumber numberWithInt:i]]; 
    } 
} 

CURA:

for (int i = 0 ; i < firstArray.count ; i ++) 
{ 

NSString *search = [firstArray objectAtIndex:i]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF CONTAINS %@", search]; 
NSMutableArray *temAraay = [secondArray filteredArrayUsingPredicate: predicate]; 
if(temArray.count >=0) 
{ 
    NSLog("%@", [temArray objectAtIndex:0]); 
} 
} 
+0

quale tipo diIndice diverso? – NGOT

+0

Questo è troppo iterativo e richiede molto tempo se gli array sono grandi. Non è un modo efficiente. –

+0

Grazie ma voglio solo ottenere oggetto diff non tutto oggetto – NGOT

8

Puoi provare anche questo.

NSMutableArray *array1 = [[NSMutableArray alloc]initWithObjects:@"1",@"2",@"3",@"1", nil]; 
NSMutableArray *array2 = [[NSMutableArray alloc]initWithObjects:@"2",@"1", nil];  

NSMutableArray *largeArray; 
NSMutableArray *shortArray; 
if([array1 count] > [array2 count]){ 
    largeArray = array1; 
    shortArray = array2; 
} else { 
    largeArray = array2; 
    shortArray = array1; 
} 
[largeArray removeObjectsInArray:shortArray]; 

for (NSString *va in largeArray) { 
    NSLog(@"%@",va); 
} 
+0

Ora puoi determinare quale è grande e quale è corto? –

+0

@RanjuPatel come se fosse una matrice in cui si desidera controllare i duplicati (i duplicati sono anche nell'array). – Buntylm

4

Ho usato il seguente, ma ho i risultati desiderati:

for(int i =0; i<[arraytwo count]; i++) 
{ 
    if (![arrayone containsObject:[arraytwo objectAtIndex:i]]) 
     [arraythree addObject: [arraytwo obectAtIndex:i]]; 
}  
NSLog(@"%@",arraythree); 
+0

Probabilmente più efficiente dell'approccio impostato (almeno per gli array più piccoli). –

+0

Lo sto usando anche per gli array più grandi. Potrebbe richiedere del tempo per un array più grande, ma lo sto facendo in background quindi funziona bene. –

+0

Sì, è solo che non ho passato una stima "grande O" per i vari schemi. Probabilmente l'approccio impostato è un capello più efficiente per set di grandi dimensioni, ma è probabile che tu debba essere tra le migliaia di elementi per renderlo significativo. –