2013-06-18 26 views
5

Ben seat adında bir özellik ile özel nesneleri içeren bir dizi var. Koltuk 1A, 1D, 1C, 1k, 2A, 2k, 2D, 2C değerlerine sahip olabilir. Şimdi bu Bu özellikte bir dizi özel nesneyi nasıl sıralarım?

herhangi bir sırada düzenlenebilir ve ben ancak sıralama Yalnızca A, C, D veya K.

istediğim koltuklar sayısal değere karşılık değil, sınıfa göre sıralamak istiyor sipariş 1A, 1C, 1D, 1K vb.

Ben SeatDO nesneyi uygulanır ne budur:

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

nasıl buna da harfleri düşünün yaparım ..? Eğer bir NSArray kullanıyorsanız

+0

'Koltuk' enum olarak mı uygulandı? Değilse, ne tür bir nesne 'koltuk' değerleridir? koltuk @makaron – makaron

+0

Ben sıralanmış bir dizide almak için biliyorum .. soruma elde etmediği –

+3

Peki, o zaman Gabriele'nın cevabı çalışması gerekir) NSString, ancak sıralama mekanizması koltuğunda harflerle dikkate almaz. sadece sayısallar. – makaron

cevap

7

Eğer NSString s

koltuk numaralarını dönüştürmek varsayarsak sıralanmış dönecektir
NSArray *sortedSeats = [seats sortedArrayUsingSelector:@selector(localizedStandardCompare:)] 

hile yapmak gerekir. Sıralama dizeleri, ihtiyaç duyduğunuz sıralama düzenini doğal olarak takip edecektir.

Aksi takdirde sadece ben stringValue özel nesne için kullanılabilir olduğunu farz

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

ile karşılaştırıldığında sırasında dizeleri kullanabilirsiniz. Değilse, örneklerinizi bir NSString açıklamasıyla döndürecek bir şeyle değiştirin.

Alladinian önerdiği gibi NOT

elde edersiniz doğru lexicographic sırayla amacıyla, caseInsensitiveCompare: aksine localizedStandardCompare: kullanmak istiyorum.

Eğer tüm başkalarının önünde görünür bir @"10D" veya @"01C" koltuk eklerseniz, doğru gibi görünebilir caseInsensitiveCompare: iken
+0

+1. NSString kullanın. Size zaman ve çaba kazandıracak. – rdurand

+0

Bu "10D" veya örneğin "01C" ... – Alladinian

+1

Merhaba Gabriele gibi bir koltuk ile ilgili bir sorun tanıtacak (bu arada artik fairplay thanx, bu bu topluluğu kadar harika kılan).Cevabınız doğru olarak seçildiğinden, küçük bir yazım hatası düzeltmek isteyebilirsiniz: 'sortArrayUsingSelect:' olmalıdır 'sortArrayUsingSelector:' – Alladinian

-2

Eğer sortedArrayUsingSelector kullanarak sıralayabilirsiniz: (SEL) karşılaştırıcı ve başka dizi

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

görünüyor –

+0

Kullanıcı, nasıl hesaba katılacağını bilmek istedi ** sıralarken, bir dizinin nasıl sıralanacağını değil, bir diziyi sıralamak için değil –

+0

Ayrıca "sıralanmışArrayUsingSelector", diziye tutulan her nesneyi seçiciye gönderir. compareBySeatNumber: '. Yukarıdaki kod uygulamayı kilitler. –

3

selektör olarak kullanın localizedStandardCompare: (Bulucu benzeri sıralama)

[seats sortedArrayUsingSelector:@selector(localizedStandardCompare:)] 

...

+0

teşekkürler ...... :) –

+0

Rica ederim :) – Alladinian

İlgili konular