如何在此属性上对自定义对象数组进行排序?

时间:2013-06-18 07:52:15

标签: iphone ios objective-c sorting

我有一个包含自定义对象的数组,其中包含一个名为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;
}

我如何让它考虑这些字母..?

3 个答案:

答案 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:)];