2013-06-24 4 views
7

У меня есть массив объектов, которые состоят из двух свойств: NSString и BOOL. Я хотел бы отсортировать этот массив так, чтобы все BOOL s, которые являются YES, отображаются перед всеми bools, которые являются NO. Тогда я бы хотел, чтобы список объектов имел BOOL YES в алфавитном порядке, и мне также хотелось бы, чтобы объекты с NO были в алфавитном порядке. Есть ли какая-то библиотека, которая может выполнить это в объективном c? Если это не самый эффективный способ сделать это?Сортировка массива на основе двух параметров

ответ

20

Вы можете использовать NSSortDescriptor с, чтобы сделать сортировку:

// Set ascending:NO so that "YES" would appear ahead of "NO" 
NSSortDescriptor *boolDescr = [[NSSortDescriptor alloc] initWithKey:@"boolField" ascending:NO]; 
// String are alphabetized in ascending order 
NSSortDescriptor *strDescr = [[NSSortDescriptor alloc] initWithKey:@"strField" ascending:YES]; 
// Combine the two 
NSArray *sortDescriptors = @[boolDescr, strDescr]; 
// Sort your array 
NSArray *sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors]; 

Вы можете прочитать больше о сортировке с дескрипторами here.

1

Посмотрите на NSSortDescriptors. Создайте два, один для строки, один для bool. Затем добавьте оба массива. Затем используйте метод NSArray sortedArrayWiyhDescriptors.

3

Альтернативой использования сортировки дескрипторов заключается в использовании NSComparator:

NSArray *myObjects = ... // your array of "Foo" objects 
NSArray *sortedArray = [myObjects sortedArrayUsingComparator:^(Foo *obj1, Foo *obj2) { 
    if ((obj1.boolProp && obj2.boolProp) || (!obj1.boolProp && !obj2.boolProp)) { 
     // Both bools are either YES or both are NO so sort by the string property 
     return [obj1.stringProp compare:obj2.stringProp]; 
    } else if (obj1.boolProp) { 
     // first is YES, second is NO 
     return NSOrderedAscending; 
    } else { 
     // second is YES, first is NO 
     return NSOrderedDescending; 
    } 
)]; 

Пожалуйста, обратите внимание, что я, возможно, последние два назад. Если это сортирует значения «Нет» до значений «Да», замените последние два значения возврата.