2013-06-18 111 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

相關問題