2009-07-16 13 views
17

Ho due array in Objective C e ho bisogno di trovare quale indice è qualcosa così posso inserirlo nello stesso posto. Ad esempio, diciamo che ho un "array di nomi" e un "array di età". Come faccio a sapere quale indice "charlie" è nel "nome array", quindi so dove inserire la sua età nella matrice "età"?Come determinare un indice di matrice nell'obiettivo C?

Grazie

risposta

38

-[NSArray indexOfObject:] sembrerebbero essere la scelta più logica.

+0

Sì, sarebbe chuck, grazie non ho potuto trovare che nel riferimento alla classe NSMutableArray. – Xcoder

+4

Sì, i documenti NSMutableArray contengono solo metodi che hanno a che fare con gli array mutanti. Vale sempre la pena di controllare anche i documenti della superclasse. – Chuck

+1

I documenti rendono facile dimenticare di controllare metodi ereditati, ivars e proprietà. Procurati una copia dell'app AppKiDo di Andy Lee e sarà più facile vedere cosa potresti perdere. Alcune classi sono più facili da capire quando le vedi sotto una nuova luce. – uchuugaka

4

Si potrebbe anche voler usare un NSDictionary anche se si stanno facendo ricerche basate su stringhe.

+0

Questo è un grande punto. Le persone spesso trascurano il fatto che la ricerca di una matrice per una determinata stringa richiede tempo lineare, mentre la ricerca di una stringa in un dizionario richiede tempo costante. Chuck ha ragione su come farlo per gli array, ma sulla base della descrizione sparsa, un dizionario sembra una grande soluzione potenziale. –

+2

Anche così, vale la pena ricordare che il tempo lineare può essere più veloce del tempo costante se la costante è grande o la linea è breve. Fondamentalmente, non ti preoccupare fino a quando non hai confermato misurando che è davvero un problema di prestazioni. –

6

Nel cacao, gli array paralleli sono un percorso di distruzione e rovina. Non è possibile utilizzarli in modo efficace con Bindings, quindi dovrai scrivere molto codice di colla, come se i binding non esistessero. Inoltre, stai eliminando qualsiasi futuro supporto AppleScript/scripting bridge che potresti voler avere prima ancora di iniziare a implementarlo.

Il modo corretto consiste nel creare una classe del modello con le proprietà name e age e disporre di una singola matrice di istanze di tale classe. Quindi, per trovare un elemento per nome o per età, utilizzare NSPredicate per filtrare l'array e indexOfObjectIdenticalTo: per trovare l'indice di ciascun elemento dall'array filtrato nell'array principale.

La differenza tra indexOfObject: e indexOfObjectIdenticalTo: è che il primo invierà isEqual: messaggi per determinare se ogni oggetto è quello che sta cercando, mentre il secondo sarà cercare solo per l'oggetto specifico avete passato. In questo modo, è possibile utilizzare indexOfObject: con un oggetto che non è nella matrice ma è uguale a uno che è, al fine di trovare l'oggetto uguale nella matrice.

Problemi correlati