我有一个由两个属性组成的对象数组:NSString
和BOOL
。我想对此数组进行排序,以便所有BOOL
YES
出现在所有NO
的bool之前。然后我想要对BOOL YES
按字母顺序排列的对象列表,我也希望将NO
的对象按字母顺序排列。是否有某种类型的库可以在目标c中实现这一目标?如果不是最有效的方法是什么?
答案 0 :(得分:21)
您可以使用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 :(得分:4)
使用排序描述符的替代方法是使用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;
}
)];
请注意我可能会向后退两个。如果在Yes值之前对No值进行排序,则交换最后两个返回值。
答案 2 :(得分:2)
查找NSSortDescriptors。创建两个,一个用于字符串,一个用于bool。然后将两者都添加到数组中。然后使用NSArray方法sortedArrayWiyhDescriptors。