У меня есть массив объектов, которые состоят из двух свойств: NSString
и BOOL
. Я хотел бы отсортировать этот массив так, чтобы все BOOL
s, которые являются YES
, отображаются перед всеми bools, которые являются NO
. Тогда я бы хотел, чтобы список объектов имел BOOL YES
в алфавитном порядке, и мне также хотелось бы, чтобы объекты с NO
были в алфавитном порядке. Есть ли какая-то библиотека, которая может выполнить это в объективном c? Если это не самый эффективный способ сделать это?Сортировка массива на основе двух параметров
7
A
ответ
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;
}
)];
Пожалуйста, обратите внимание, что я, возможно, последние два назад. Если это сортирует значения «Нет» до значений «Да», замените последние два значения возврата.