2009-06-19 4 views
6

NSDictionary va bene per le coppie chiave-valore, in base a quale struttura dati è migliore quando si hanno tre valori? È meglio creare una classe per quei 3 valori e quindi lasciare che ogni oggetto in una matrice contenga istanze di quella classe?Se NSDictionary è valido per i valori accoppiati, cosa è buono per i valori tripli?

Nel dettaglio: La struttura dei dati, chiamiamola una persona, ho immaginare ha tre valori: (NSString) nome, (Int) di età, (BOOL) isAlive

Questi sarebbero tenuti in array (?). È importante poter usare entrambi il nome come chiave e fare riferimento all'intero blocco con un numero, a partire da zero.

+1

Questa nuova struttura avrebbe 2 chiavi e 1 valore o 1 chiave e 2 valori? O intercambiabile? – samoz

+0

Penso che tu debba spiegare la domanda in modo più approfondito. – U62

+1

Sì, NSDictionary memorizza le coppie chiave-valore, ma non è proprio questo il punto. Le coppie non sono simmetriche, non puoi semplicemente generalizzare a "triple" senza considerare che l'intero * punto * di NSDictionary è che le chiavi sono uniche mentre i valori non devono essere. Quindi nelle tue "triple", quale dei tre elementi ha un valore, e quali sono le chiavi? – bendin

risposta

9

Se si dispone di una chiave e due valori, probabilmente si creerà una classe per i due valori e si utilizzerà ancora un dizionario.

Se si dispone di due chiavi e un valore, si utilizzerà probabilmente un dizionario nidificato, ovvero un dizionario in cui la chiave è la prima chiave e il valore è un altro dizionario. La chiave per il dizionario annidato sarebbe la seconda chiave, e il valore sarebbe il tuo valore reale.

ETA:

Ora che hai chiarito la tua domanda - se avete bisogno di accedere alla collezione sia da tasto o da indice intero, è comunque possibile utilizzare un dizionario.

Per ottenere un elemento da tasto, si dovrebbe fare questo:

[myDict objectForKey:@"joe"]; 

Per avere un elemento in base all'indice, è possibile utilizzare la matrice allKeys:

[myDict objectForKey:[[myDict allKeys] objectAtIndex:1]]; 

Se l'unico scopo per ottenere le persone per indice si stanno spostando su tutta la collezione, starai meglio a cercare nell'uso del metodo keyEnumerator per enumerare le chiavi in ​​un ciclo e usare quelle chiavi per cercare i valori.

-1

Non è la descrizione di un array two dimensional?

+0

Stai pensando a un array in cui ogni elemento si collega a un array con 3 elementi. Tuttavia, un array bidimensionale non ha nulla a che fare con l'archiviazione delle coppie chiave-valore - che richiede un dizionario, qualcosa che potresti vedere anche come "mappa", "array associativo", "hash", ecc. In particolare, NSDictionary supporta coppie di 1 tasto per 1 valore - sta cercando 1 chiave per 3 valori. –

0

Dipende se si sta tentando di creare una sorta di struttura di dati generalizzata o meno. Se le "tre" cose sono concetti particolari all'interno della tua app, allora potresti essere diretto verso un domain model - nel qual caso potresti essere saggio incapsulare questi valori in una classe.

Se è necessaria una funzionalità simile al dizionario - [NSDictionary objectForKey:] ecc., Allora è ancora possibile utilizzare uno o più dizionari come indici che associano valori chiave alle istanze di classe.

1

È possibile utilizzare i dati di base per rappresentare relazioni dati più complesse, utilizzando un modello di database relazionale.

Controlla il sito degli sviluppatori di Apple per esempi e documentazione.

0

È necessario esaminare CoreData (se lo si sta memorizzando) e definire una classe per il proprio oggetto. Gli oggetti generici nativi come NSDictionary non sono pensati per la memorizzazione di valori complessi che costituiscono oggetti complessi come una Persona.

Person *person = [[Person alloc] init]; 
person.firstName = @"blah"; 
person.age = 24; 
person.isAlive = YES; 
1

Può sembrare estranei in un primo momento, ma guarda che la struttura dizionario orientata in questo Introduction to Cocoa Bindings. (CocoaDevCentral e Scott Stevenson sono grandi risorse per i nuovi sviluppatori di Cocoa.) L'approccio che usa è estremamente flessibile e facile da cambiare lungo la strada.L'utilizzo di un dizionario al posto di ivars non è sempre la soluzione migliore, ma potrebbe essere adatto alle tue esigenze.

Nota: Come i dati principali, anche le associazioni di cacao sono un argomento molto complesso. Sto suggerendo di utilizzare solo l'aspetto organizzativo del tutorial, non andando a tutto campo con i binding. :-)