我有一个包含自定义对象的数组,其中包含一个名为seat
的属性。座椅可具有值1A,1D,1C,1k,2A,2k,2D,2C。
现在这些可以按任何顺序排列,我想根据类别对它们进行排序,但是排序只考虑座位数值而不是A,C,D或K.
我希望订单为1A,1C,1D,1K等。
这是我在SeatDO对象中实现的:
-(NSComparisonResult) compareBySeatNumber:(SeatDO*)other {
NSComparisonResult result = NSOrderedSame;
NSInteger seatNumber = [self.seat integerValue];
NSInteger otherSeatNumber = [other.seat integerValue];
if (seatNumber > otherSeatNumber) {
result = NSOrderedDescending;
} else if (seatNumber < otherSeatNumber) {
result = NSOrderedAscending;
}
return result;
}
我如何让它考虑这些字母..?
答案 0 :(得分:7)
假设您将座位号转换为NSString
s
NSArray *sortedSeats = [seats sortedArrayUsingSelector:@selector(localizedStandardCompare:)]
应该做的伎俩。排序字符串自然会遵循您需要的排序顺序。
否则你可以在与
比较时使用字符串[seats sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [[obj1 stringValue] localizedStandardCompare:[obj2 stringValue]];
}];
我假设stringValue
可用于您的自定义对象。如果没有,只需将其替换为会返回NSString
实例描述的任何内容。
注意强>
根据Alladinian的建议,您希望使用localizedStandardCompare:
而不是caseInsensitiveCompare:
,以获得正确的字典顺序。
答案 1 :(得分:3)
使用localizedStandardCompare:
作为选择器(类似Finder的排序)
[seats sortedArrayUsingSelector:@selector(localizedStandardCompare:)]
虽然caseInsensitiveCompare:
似乎是正确的,但如果您添加@"10D"
或@"01C"
席位,它会出现在所有其他人面前......
答案 2 :(得分:-2)
如果您正在使用NSArray,您可以使用sortedArrayUsingSelector:(SEL)比较器对其进行排序,它将返回另一个已排序的数组
NSArray *arraySorted = [myArray sortedArrayUsingSelector:@selector(compareBySeatNumber:)];