如何按照某个属性对自定义对象数组进行排序?

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;
}

我该如何让它同时考虑字母呢?


“seat” 是否被实现为枚举类型?如果不是,那么“seat”的值是什么类型的对象? - makaron
@makaron座位是NSString。 - Ankit Srivastava
3
好的,那么Gabriele的回答应该有效。 - makaron
3个回答

7

假设你将座位号转换为 NSString

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
嗨Gabriele(顺便感谢您的公平竞争,这正是使这个社区如此棒的原因)。由于您的答案已被选为正确答案,您可能希望修复一个小错误:sortedArrayUsingSelect: 应更改为 sortedArrayUsingSelector: - Alladinian

3

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

[seats sortedArrayUsingSelector:@selector(localizedStandardCompare:)]

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


-2

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

NSArray *arraySorted = [myArray sortedArrayUsingSelector:@selector(compareBySeatNumber:)];

似乎你没理解我的问题...我知道如何获得排序后的数组,但排序机制不考虑座位中的字母...只考虑数字。 - Ankit Srivastava
用户想要知道在排序时如何同时考虑字母,而不是如何对数组进行排序。 - Alessandro Vendruscolo
此外,sortedArrayUsingSelector 将向数组中保存的每个对象发送选择器,而这些对象显然无法响应 compareBySeatNumber:。以上代码将导致应用程序崩溃。 - Gabriele Petronella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接