NSMutableArray Ordinamento Con Selettore

Ho cercato su google, una ricerca su stackoverflow senza risposte soddisfacenti.

Nella documentazione, si afferma che:

sortUsingSelector: Ordina l’array
elementi in ordine crescente, come
determinato dal metodo di confronto
specificata per il selettore.

  • (void)sortUsingSelector:(SEL)comparatore
    Parametri comparatore di Un selettore che
    specifica il metodo di confronto per l’uso
    per confrontare gli elementi della matrice. Il
    comparatore messaggio viene inviato a ciascun
    oggetto dell’array e ha come
    unico argomento di un altro oggetto in
    array. Il comparatore di un metodo di
    ritorno NSOrderedAscending se l’array
    è più piccolo di un argomento,
    NSOrderedDescending se la matrice è
    più grande è l’argomento, e
    NSOrderedSame se sono uguali.

Sto cercando di capire come funziona realmente. Quindi, se ho questo metodo a mio oggetto all’interno
classe array:

- (NSComparisonResult) compareNames: (id) element
{
    return [userName compare: [element userName]];
}

Ed eseguirlo con

[myArray sortUsingSelector:@selector(compareNames:);

Funziona. Il problema è che non so perché funziona. Il tipo di ritorno per NSComparisonResult
sono Ascendente, lo Stesso, o Decrescente. Da quello che ho leggendo la documentazione è
il compareNames metodo viene inviato ad ogni oggetto in myArray e confrontare i selezionati
proprietà dell’oggetto (in questo caso è il nome utente con il nome utente di un altro oggetto all’interno del
stessa matrice. ([0] array viene confrontato con l’ [1] array). Voglio sapere come questo
tutto il processo è in corso.

Aggiornamento 1: Algoritmo di Ordinamento per Più Chiavi

Ho perso il ! nel confronto. Dovrebbe essere giusto, come questo:

NSComparisonResult res;
res = [[self userName] compare: [element userName]];
if(res == NSOrderedSame) res = [[self email] compare: [element email]];
return res;

Come per l’ordinamento in discesa, si può utilizzare il sensore o se per ripristinare il NSComparisonResult valore sostituendo “return res” con questo:

switch (res)
    {
        case NSOrderedAscending:
            return NSOrderedDescending;
            break;
        case NSOrderedDescending :
            return NSOrderedAscending;
            break;
        default:
            return NSOrderedSame;
            break;
    }*/
Che cosa esattamente non ti è chiara? In sostanza, si confronta tutti paires di oggetti e di swap, se sono nell’ordine sbagliato. (In realtà, però, non si deve confrontare tutti i paires, n*log(n) sono sufficienti.)
Non sempre ordinamento in ordine Crescente? Cosa devo fare se voglio ordinare per più valori. Come ordinare per nome, seguita dall’ordinamento per e-mail.

OriginaleL’autore sayzlim | 2011-03-03

2 Replies
  1. 4

    Per rispondere alla tua subquestions nei commenti:

    Fa ordinamento è necessario essere sempre Crescente? – NSOrderedAscending & NSOrderedDescending sono solo simbolici qui, sarebbe meglio pensare a loro come “oggetto viene prima di argomento” e “oggetto” viene dopo” argomento nell’ordinamento. E. g. se la memorizzazione di una matrice di NSNumber quindi “1 compareTo:2” dovrebbe tornare NSOrderedAscending se si desidera ordinare con l’aumento di valore, e NSOrderedDescending se si desidera ordinare con la diminuzione di valore.

    Come si fa a ordinare con più tasti? – Qualsiasi algoritmo di ordinamento solo bisogno di sapere se un elemento viene prima, dopo, o nella stessa posizione come un’altra. Come si determina che è fino a voi. Utilizzare due chiavi di ordinamento quindi in pseudo-codice dell’algoritmo è:

    To compare item1 and item2
        order = [item1.key1 compareTo:item2.key1];
        if (order == NSOrderedSame) order = [item1.key2 compareTo:item2.key2];
        return order

    Estendere a più tasti o più complessi i confronti necessari.


    Di follow-up di commento:

    Mi dispiace, ma la dotazione algoritmo non fare un 2 chiave di ordinamento, e, in generale, la combinazione di tasti non e ‘ uno spreco.

    In inglese ordinamento per due tasti va come segue: il primo confronto la prima chiave di ogni oggetto, se si confronta non è uguale per poi tornare al loro ordine. Se sono uguali, quindi spostare su e rispetto la seconda chiave di ogni oggetto e restituire loro ordinazione.

    Questo è esattamente ciò che il pseudo-codice di cui sopra.

    Combinazione di più tasti è problematico per una serie di motivi:

    1. È necessario combinare l’utilizzo di un separatore che non può verificarsi nelle chiavi. Come semplice esempio, considerare l’ordinamento per nome, cognome, quando si dispone di due persone “jack yolander” e “jacky olander” – un ingenuo entrare produce “jackyolander” per entrambi, e che sarebbe sorta uguale. Quindi, avete bisogno di un separatore che non verificarsi in una qualsiasi delle chiavi.

    2. Se le chiavi sono di diversi tipi, ad esempio, una stringa e un numero, si finisce per convertirli tutti in stringhe di coniugare spreco e forse anche impreciso.

    3. Semplicemente la loro combinazione è spreco – si sta generando oggetti che non ti servono.

    Etc. Basta confrontare i tasti a coppie fino a trovare due che differiscono o per l’ultima coppia. Funziona per qualsiasi numero di chiavi di tutti i tipi, e non è uno spreco.

    L’algoritmo è fornito solo ordinare un singolo tasto. Perché una volta che si ordina tutte le key1, l’ordinamento si resort tutto l’array ordinato utilizzando key2. Io l’ho provato e non dare il risultato che voglio. Non sono sicuro di come l’ordinamento è in corso un processo all’interno delle classi. Ma posso ottenere il risultato che voglio combinando chiave in un unico NSString e ordinare secondo un metodo di confronto. Ho inserito il codice di cui sopra.
    Ci dispiace, ma la dotazione algoritmo di non fare un 2 chiave di ordinamento, e, in generale, la combinazione di tasti non e ‘ uno spreco.
    Ho perso il e digitato ! durante il confronto. Nessuna meraviglia che non produce il risultato che mi aspetto. La tua è perfettamente funzionante. Mi dispiace che non ho fatto controllare il mio codice in modo corretto prima di modificare o di risposta. E grazie per le vostre risposte dettagliate.
    davvero male spiegato..

    OriginaleL’autore CRD

  2. 1

    sortUsingSelector sarà utilizzando Quicksort o un simile algoritmo di ordinamento per ordinare l’array. Algoritmi di ordinamento devono essere in grado di confrontare due elementi della collezione per essere ordinati e determinare dove si dovrebbe apparire rispetto all’altro in modo ordinato. Dovrebbe comparire prima di B, dopo la B, o immediatamente a fianco di esso? Personalizzati metodo sort (compareNames nel tuo esempio) è l’algoritmo di ordinamento per determinare che il processo di ordinazione.

    Guardare il Voce di Wikipedia per algoritmi di ordinamento per alcune informazioni su questo.

    Non troverete molto online su questo, se si cerca ad esempio “sortUsingSelector”. Questo non è un Obiettivo-C-specifico problema, praticamente tutti i linguaggi di programmazione hanno una sorta di routine che utilizzano definito dall’utente, in funzione di confronto per eseguire l’ordinamento.

    OriginaleL’autore Simon Whitaker

Lascia un commento