5

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

我如何让它也考虑字母..?

4

3 回答 3

7

假设您将座位号转换为NSStrings

NSArray *sortedSeats = [seats sortedArrayUsingSelector:@selector(localizedStandardCompare:)]

应该做的伎俩。对字符串进行排序自然会遵循您需要的排序顺序。

否则,您可以在与

[seats sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [[obj1 stringValue] localizedStandardCompare:[obj2 stringValue]];
}];

我假设这stringValue可用于您的自定义对象。如果没有,只需将其替换为任何将返回NSString实例描述的内容。

笔记

正如 Alladinian 所建议的,您希望使用localizedStandardCompare:与 , 相对的caseInsensitiveCompare:,以获得正确的词典顺序。

于 2013-06-18T07:57:57.683 回答
3

用作选择localizedStandardCompare:器(类似 Finder 的排序)

[seats sortedArrayUsingSelector:@selector(localizedStandardCompare:)]

虽然caseInsensitiveCompare:可能看起来是正确的,但如果您添加一个@"10D"@"01C"座位,它会出现在所有其他人的前面......

于 2013-06-18T08:03:45.930 回答
-2

如果您使用的是 NSArray,则可以使用 sortedArrayUsingSelector:(SEL)comparator 对其进行排序,它将返回另一个排序的数组

NSArray *arraySorted = [myArray sortedArrayUsingSelector:@selector(compareBySeatNumber:)];
于 2013-06-18T07:56:29.733 回答