2009-08-14 2 views
27

У меня есть NSDictionary, где каждый ключ указывает на массив. Позднее я хочу объединить все значения в один массив. Есть ли способ использовать API, чтобы сделать что-то более эффективное, чем сказать:Объединение NSArrays в 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

Ответил на http://stackoverflow.com/q/8569388/78336 – neoneye

ответ

59

Просто используйте [newArray addObjectsFromArray:anArray];

+0

Привет, Бен, Если я так делаю, у меня нет плоского массива. У меня массив массивов. Я видел, можно ли делать это без петли. – Coocoo4Cocoa

+1

Это все равно даст вам плоский массив; вы не добавляете массив, вы добавляете объекты из массива. –

+1

Coocoo4Cocoa: Я думаю, вы путали 'addObject' **' FromArray: '** с' addObject: '. 'addObject:' добавляет * массив * в новый массив, в то время как предложенный Чаком и Бен Готлибом добавляет элементы в массив к новому массиву. –

19

Там есть некоторая путаница в ответ Бенни Готлиба выше. Чтобы уточнить, он предлагает использовать addObjectsFromArray вместо внутреннего цикла, тогда как Coocoo запутан, потому что он считает, что он предлагается в качестве замены для ВСЕХ циклов. (Если вы сделаете это, вы действительно не останетесь неуплощающейся массив массивов как на его возражение.)

Вот достаточно элегантное решение, которое не требует какого-либо явное зацикливания:

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

кстати этот код оставит дубликаты в сплющенном массиве. Если вы хотите удалить дубликаты, используйте distinctUnionOfArrays вместо unionOfArrays.

+6

Сегодня это лучшее решение, чем все вышеперечисленное. – Cezar

 Смежные вопросы

  • Нет связанных вопросов^_^