2013-06-18 245 views
5

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

我如何让它考虑字母以及..?如果你使用一个NSArray

+0

是否将'座位'实施为枚举?如果不是,“座位”的值是什么类型的对象? – makaron

+0

@makaron席位nsstring –

+3

那么,Gabriele的答案应该工作) – makaron

回答

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:,以便将得到适当的字典顺序。

+0

+1。使用NSString。它会为您节省时间和精力。 – rdurand

+0

这会引入一个像“10D”或“01C”这样的座位的问题,例如... – Alladinian

+1

嗨加布里埃尔(thanx fairplay的方式,这是什么让这个社区如此真棒)。由于您的答案被选定为正确的,您可能需要修正一个小的错字:'sortedArrayUsingSelect:'应该是'sortedArrayUsingSelector:' – Alladinian

-2

您可以使用sortedArrayUsingSelector对它进行排序:(SEL)比较,它会回报你另一个数组排序

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

似乎你没有得到我的问题..我知道如何获得排序的数组,但排序机制不占座位的字母。只有数字。 –

+0

用户想知道如何在排序时考虑**还有字母**,而不是如何对数组进行排序 –

+0

此外'sortedArrayUsingSelector'将向数组发送选择器中的每个对象,当然这些对象不响应到'compareBySeatNumber:'。上面的代码会导致应用程序崩溃。 –

3

使用localizedStandardCompare:作为选择(搜索类排序)

[seats sortedArrayUsingSelector:@selector(localizedStandardCompare:)] 

虽然caseInsensitiveCompare:似乎是正确的,如果添加它会出现在所有别人面前@"10D"@"01C"座...

+0

谢谢...... :) –

+0

不客气:) – Alladinian

相关问题