2012-03-09 9 views
0

У меня есть NSArray из Object, который имеет интересный property, что я хотел бы использовать следующим образом: Учитывая мой массив объектов со свойствами:заказ, ведро сортировки и порядок ведра NSMutableArray

Object1 - Property A; Object2 - Property A; Object3 - Property B; Object4 - Property D; Object5 - Property D; Object6 - Property D

Я хочу, чтобы они были ведро отсортированный по их свойствам в новый массив:

Array1 - Objects Object1, Object2

Array2 - Objects Object3

Array3 - Objects Object 4, Object5, Object6

И затем внутри каждого массива, сортировки с помощью timeStamp Недвижимость.

Я попытался сделать это наивно, создав словарь, добавив интересные объекты в словарь по свойству вроде if ([dictionary objectForKey:@"propertyVal"]) //add object else // create array for key, add object to array. Этот подход не сработал, как ожидалось, потому что мне нужно отключить NSMutableDictionary, используя allKeysForValue, что не является надежным.

Я чувствую, что это довольно распространенная проблема, и я хотел бы услышать любое представление о том, как я могу решить это. Код отличный, но даже алгоритм (с соответствующими объектами для использования) должен быть достаточным.

+0

Использование словаря массивов звучит разумно. Объясните, что вы подразумеваете под «dekey the NSMutableDictionary», почему вам нужно это сделать и как это произошло. Кроме того, нет '- [NSDictionary allKeysForValue]', вы имеете в виду 'allKeysForObject'? –

+0

Да, я имел в виду 'allKeysForObject'. Он возвращает 'nil', когда я передаю исходную строку. –

+0

Снова объясните, что означает «dekey the NSMutableDictionary», потому что это не ясно. Когда вы закончите создание словаря, вы сможете легко и быстро перебирать ключи и значения (массивы), не требуя «-allKeysForObject». –

ответ

1

Это не правильный вид в виде ковша, но он должен работать для набора из трех свойств. Немного возиться, и вы можете настроить его для любого количества свойств:

Редактировать. Я сделал динамическую версию (просто установил тип свойства для того, что вам нужно):

- (NSMutableArray *)order:(NSDictionary *)objects byProperty:(id)property { 
    NSMutableSet *propertySet = [NSMutableSet setWithCapacity:5]; // so we can count the unique properties 
    for (Object *obj in [objects allValues]) { 
     [propertySet addObject:[obj property]]; 
    } 

    NSMutableArray *objectCollections = [NSMutableArray arrayWithCapacity:[propertySet count]]; 

    // create arrays for every property 
    for (int i = 0; i < [objects allValues]; i++) { 
     NSMutableArray *collection = [NSMutableArray arrayWithCapacity:5]; 
     [objectCollections addObject:collection]; 
    } 
    NSArray *allProperties = [propertySet allObjects]; 

    // push objects into arrays according to a certain property 
    for (Object *obj in [dictionary allValues]) { 
     [[objectCollections objectAtIndex:[allProperties indexOfObject:[obj property]] addObject:obj]; 
    } 

    NSMutableArray *result = [NSMutableArray arrayWithCapacity:[objectCollections count]]; 
    // sort arrays by timestamp 
    for (int i = 0; i < [objectCollections count]; i++) { 
      [result addObject:[[objectCollections objectAtIndex:i] sortedArrayUsingComparator:^(id obj1, id obj2) { 
      if ([(Object *)obj1 timeStamp] > [(Object *)obj2 timeStamp]) { 
       return (NSComparisonResult)NSOrderedAscending; 
      } 
      if ([(Object *)obj1 timeStamp] < [(Object *)obj2 timeStamp]) { 
       return (NSComparisonResult)NSOrderedDescending; 
      }    
      return (NSComparisonResult)NSOrderedSame; 
     }]; 
    } 
    return result; 
} 
+0

Проблема в том, что создание массивов «вверх» не является жизнеспособным, так как я не обязательно знаю, какие будут свойства A, B, C .... Они могут быть чем угодно. –

+0

Ну, тогда оберните все в функцию и сделайте ее динамичной. Вы можете использовать общий шаблон моего решения и параметризовать его. – Alexander

+0

Я дам ему вращение ... –

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