Сортировка NSMutableArray по дате

Я хочу отсортировать изменяемый массив по дате. Мой массив содержит несколько dict с ключами, например: key1, key2, Birthday. Теперь мне нужно отсортировать его по ключу дня рождения: я знаю, что это можно сделать, используя:

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"birthday" ascending:YES]; 
[myArray sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];

Но моя проблема в том, что я хочу сортировать только те массивы, которые не содержат пустого поля дня рождения. Мой массив будет содержать несколько пустых полей дня рождения. Я не хочу их сортировать. Наконец, мне нужно загрузить их в виде таблицы через [self.mTable reloadData];.


person iCoder4777    schedule 14.06.2012    source источник
comment
Определите, что я не хочу их сортировать. Вы хотите, чтобы они были в конце списка? Или на тех местах, где они были до сортировки?   -  person coverback    schedule 14.06.2012
comment
Они будут в массиве, но в табличном представлении их быть не должно.   -  person iCoder4777    schedule 14.06.2012


Ответы (2)


Сначала соберите индексы всех объектов без дня рождения.

NSIndexSet *indexSet = [NSIndexSet indexSet];
[array enumerateObjectsUsingBlock:^(NSDictionary *dict, NSUInteger idx, BOOL *stop)
{
    if(![[dict allKeys] containsObject:@"birthday"]){
        [indexSet addIndex:idx];
    }
}];

Теперь удалите их из исходного массива

[array removeObjectsAtIndexes:indexSet];

Использование блока сравнения, сортировка может выглядеть как

[array sortUsingComparator: ^(NSDictionary *d1, NSDictionary *d2) {    
    NSDate *date1 = [d1 objectForKey:@"birthday"];
    NSDate *date2 = [d2 objectForKey:@"birthday"];

    return [date1 compare:date2]
}
person vikingosegundo    schedule 14.06.2012
comment
Но это также перечислит те, в которых поле дня рождения равно нулю. Я не хочу показывать эти поля - person iCoder4777; 14.06.2012
comment
поэтому фильтруйте до или после сортировки сортировки. - person vikingosegundo; 14.06.2012

Создайте другой массив для поддержки вашего табличного представления следующим образом:

NSDictionary* obj1 = [NSDictionary dictionaryWithObject: [NSDate date] forKey: @"birthday"];
NSDictionary* obj2 = [NSDictionary dictionaryWithObject: [NSDate dateWithTimeIntervalSince1970: 0] forKey: @"birthday"];
NSDictionary* obj3 = [NSDictionary dictionaryWithObject: @"wow" forKey: @"no_birthday"];

NSArray* all = [NSArray arrayWithObjects: obj1, obj2, obj3, nil];
NSArray* onlyWithBirthday = [all valueForKeyPath: @"@unionOfObjects.birthday"];

И если вам нужны полные объекты для представления таблицы, продолжайте с этим кодом:

NSPredicate* filter = [NSPredicate predicateWithFormat: @"SELF.birthday IN %@", onlyWithBirthday];
NSArray* datasource = [all filteredArrayUsingPredicate: filter];

Затем вы можете применить выбранный метод сортировки.

person Paul de Lange    schedule 14.06.2012