2013-06-18 15 views
5

Ho un array contenente oggetti personalizzati con una proprietà denominata seat. Il sedile può avere valori 1A, 1D, 1C, 1k, 2A, 2k, 2D, 2C.Come si ordina una matrice di oggetti personalizzati su questa proprietà?

Ora questi possono essere disposti in qualsiasi ordine, e voglio ordinarli secondo la classe, tuttavia l'ordinamento rappresenta solo il valore numerico sedili e non A, C, D o K

voglio l'ordine di essere 1A, 1C, 1D, 1K e così via.

Questo è quello che ho implementato nell'oggetto 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; 
} 

Come faccio a farlo considerare le lettere come pure ..?

+0

Il "sedile" è implementato come enumerazione? In caso contrario, che tipo di oggetto sono i valori di "seat"? – makaron

+0

@makaron seats are nsstring –

+3

Bene, allora la risposta di Gabriele dovrebbe funzionare) – makaron

risposta

7

Supponendo che si converte i numeri di posto per NSString s

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

dovrebbe fare il trucco. L'ordinamento delle stringhe seguirà naturalmente l'ordinamento di cui hai bisogno.

In caso contrario si potrebbe utilizzare stringhe durante il confronto con

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

ho pensato che stringValue è disponibile per voi oggetto personalizzato. In caso contrario, è sufficiente sostituirlo con qualsiasi elemento che restituisca una descrizione delle istanze di NSString.

NOTA

Come suggerito da Alladinian, si desidera utilizzare localizedStandardCompare: al contrario di caseInsensitiveCompare:, al fine di ottenere la giusta l'ordine lessicografico.

+0

+1. Usa NSString. Ti farà risparmiare tempo e fatica. – rdurand

+0

Questo introdurrà un problema con un posto come "10D" o "01C" per esempio ... – Alladinian

+1

Ciao Gabriele (grazie per il fairplay a proposito, questo è ciò che rende questa comunità così fantastica).Dal momento che la tua risposta è stata selezionata come corretta potresti voler correggere un piccolo errore di battitura: 'sortedArrayUsingSelect:' dovrebbe essere 'sortedArrayUsingSelector:' – Alladinian

-2

se si sta utilizzando un NSArray è possibile ordinare utilizzando sortedArrayUsingSelector: (SEL) di confronto e tornerà un altro array ordinato

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

Sembra che tu non abbia ottenuto la mia domanda .. So come ottenere l'array ordinato, ma il meccanismo di smistamento non tiene conto delle lettere nel posto. Solo i numeri –

+0

L'utente voleva sapere come prendere in considerazione ** anche la lettera ** durante l'ordinamento, non come ordinare un array –

+0

Inoltre 'sortedArrayUsingSelector' invierà al selettore ogni oggetto tenuto dall'array, che ovviamente non risponde a 'compareBySeatNumber:'. Il codice sopra potrebbe causare il crash dell'applicazione. –

3

Usa localizedStandardCompare: come selettore (Finder simile ordinamento)

[seats sortedArrayUsingSelector:@selector(localizedStandardCompare:)] 

Mentre caseInsensitiveCompare: potrebbe sembrare corretto, se si aggiunge un @"10D" o @"01C" sede sembrerebbe davanti a tutti gli altri ...

+0

grazie ...... :) –

+0

Prego :) – Alladinian

Problemi correlati