Порядок, сортировка сегментов и порядок сегментов NSMutableArray - PullRequest
0 голосов
/ 09 марта 2012

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

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, что ненадежно.

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

1 Ответ

1 голос
/ 09 марта 2012

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

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

- (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;
}
...