2009-08-14 9 views
27

Ho un NSDictionary in cui ogni chiave punta a un array. In seguito voglio unire tutti i valori in un unico array. C'è un modo per utilizzare l'API per fare qualcosa di più efficiente di dire:Unione di NSArrays in Objective-C

NSArray *anArray = [someDictionary allValues]; 
NSMutableArray *newArray = [NSMutableArray array]; 
start outter loop on anArray 
    start inner loop on objects in anArray 
    add objectAtIndex to newArray 
+0

Risposta in http://stackoverflow.com/q/8569388/78336 – neoneye

risposta

59

Basta usare [newArray addObjectsFromArray:anArray];

+0

Ciao Ben, se lo faccio in questo modo non ho una matrice piatta. Ho una matrice di matrici. Stavo vedendo se era possibile farlo senza il loop. – Coocoo4Cocoa

+1

Questo dovrebbe comunque fornire una matrice piatta; non stai aggiungendo la matrice, stai aggiungendo gli oggetti dalla matrice. –

+1

Coocoo4Cocoa: Penso che tu abbia confuso 'addObject' **' FromArray: '** con' addObject: '. 'addObject:' aggiunge * l'array * al nuovo array, mentre quelli suggeriti da Chuck e Ben Gottlieb aggiungono gli elementi dell'array al nuovo array. –

19

V'è una certa confusione nella risposta di Benn Gottlieb sopra. Per chiarire, sta suggerendo di usare addObjectsFromArray invece del ciclo interno, mentre Coocoo è confuso perché pensa che sia stato suggerito come una sostituzione per TUTTO il ciclo. (Se si esegue questa operazione, sarete davvero lasciato con una serie di array appiattito come per la sua obiezione.)

Ecco una soluzione ragionevolmente elegante che non richiede alcun looping esplicito:

NSArray *anArray = [someDictionary allValues]; 
NSArray *flattenedArray = [anArray valueForKeyPath: @"@unionOfArrays.self"]; 

btw questo codice lascerà duplicati nell'array appiattito. Se si desidera rimuovere i duplicati, utilizzare distinctUnionOfArray anziché unionOfArrays.

+6

Oggi, questa è una soluzione migliore di tutto quanto sopra. – Cezar