2013-06-03 13 views
13

Qual è la differenza tra uno Pair Class and a HashMap. Vedo che entrambi hanno key and value.Qual è l'uso di Pair Class e perché è stato implementato qui?

codice precedente:

List<Patient> patientDetails = new ArrayList<Patient>(); 
Patient patientInfo = new Patient(); 
patientInfo.setReligion(Constants.ReligionArray[custom.getReligion()]); 
patientDetails.add(patientInfo); 

Il codice è stato modificato per questo oggi.

codice modificato

List<Pair<String, String>> patientInfo = new ArrayList<Pair<String, String>>(); 
patientInfo.add(new Pair<String, String>("Religion", Constants.ReligionArray[custom.getReligion()])); 
  1. Perché hanno implementato un Pair Class here? Quale potrebbe essere il motivo.
  2. Qual è la differenza tra uno Pair Class and a HashMap.

Nota: entrambi i codici funzionano perfettamente.

+0

Perché? Probabilmente perché memorizzare tutto su un paziente in un oggetto non è una buona idea, per sicurezza e altro. In questo modo puoi astrarre l'accesso alle informazioni dei pazienti. – arynaq

+1

Suppongo che tu non sappia della struttura dati della tabella hash, giusto? – acdcjunior

risposta

2

Prima di parlare della differenza tra una coppia e una HashMap, lascia che ti dica perché non è proprio la domanda che vuoi rispondere. Quello che vuoi veramente sapere è perché dovresti prendere un oggetto e scomporlo in una lista di primitive chiave/valore.

Il codice si fa riferimento è la conversione da un approccio orientato oggetto di utilizzare una classe Patient (che sembra davvero come dovrebbe essere chiamato PatientInfo) in un elenco di primitive, sono essentialy "deObjectOrienting" della classe.

Quindi nel loro modello ogni variabile di classe diventa Pair dove il nome della variabile diventa la chiave e il valore della variabile diventa il valore.

Ecco un esempio di classe espansa

// Old style (Object oriented) 
class PatientInfo{ 
    String religion; 
    String address; 
} 
PatientInfo patientInfo = new PatientInfo(); 
patientInfo.setReligion("myReligionName"); 
patientInfo.setAddress("address of the patient"); 

// New Style, key/value primitive pairs (very not object oriented) 
Pair<String,String> religionInfo = new Pair<String,String>("religion","myReligionName"); 
Pair<String,String> addressInfo = new Pair<String,String>("address","address of the patient"); 

Essi quindi aggiungere questi sia il Patient o Pair in un elenco.

Perché qualcuno dovrebbe fare questa è una buona domanda. La maggior parte delle persone cerca di diventare più orientata agli oggetti in quanto facilita la codifica. Forse dal momento che è solo una singola variabile nel Clss, hanno capito perché non rimuovere completamente la classe?

Alla domanda originale tra una coppia e una HashMap. Una coppia è solo una chiave/valore. Una HashMap è la raccolta solitamente usata per memorizzare molte coppie chiave/valore. Qui stanno usando una lista in cui dovrebbero probabilmente usare HashMap.

0

Un oggetto Pair memorizza esattamente una chiave e un valore. A HashMap è una struttura in cui è possibile memorizzare diverse coppie chiave/valore.

+0

In realtà, un 'HashMap' è una' Mappa', non una 'Collezione'. – Genzer

+0

Hai ragione, ho corretto la mia risposta. – eternay

+0

Con i generici una coppia avrebbe senso. –

0

Una "coppia" è una coppia di elementi che si desidera correlare in un modo o nell'altro. Non ci sono imposizione chiave, elenchi di oggetti o altro. È semplicemente una scorciatoia per quando hai un paio di elementi che sono davvero più utili come una coppia di elementi, ma una struttura abbastanza semplice in cui non è necessario creare una classe separata per metterli in relazione. Esempi: punti su un rettangolo, indirizzi IP su domini, ecc.

Una mappa di hash può essere pensata come una mappatura di coppie, con l'applicazione di una specifica "chiave". In questo caso il primo oggetto della coppia diventa "costante" e viene usato per riferirsi al secondo oggetto. Nel mio esempio di coppie ho usato indirizzi IP per domini. In questo caso utilizzeremmo il dominio come "chiave" e usarlo per fare riferimento all'indirizzo IP della macchina. Ovviamente questo indirizzo IP potrebbe cambiare, ma il dominio sarebbe sempre lo stesso e verrà utilizzato per cercare rapidamente l'indirizzo IP attualmente associato. Si noti che la restrizione del primo elemento della coppia come "chiave" deriva dalla mappa hash e non dalla specifica della coppia stessa. La parte hash di hashmap fa riferimento a come vengono visualizzati gli articoli, in questo caso una tabella hash, sul 'primo' elemento nella coppia ...

7

In realtà, il codice è stato modificato dal tipico approccio Java in quello che viene spesso definito "negazione di oggetti". La sostituzione è avvenuta da un oggetto dominio dedicato Patient in un generico Pair<String, String>.

Quindi stai chiedendo la differenza tra List<Pair<String,String>> e uno Map<String,String>. Il primo contiene più informazioni perché mantiene l'ordine di inserimento delle singole coppie e consente anche l'accesso casuale in base alla posizione nell'elenco.

A Map, d'altra parte, consente una ricerca efficiente basata sulla chiave, che è ciò che è veramente necessario.

7
  1. La classe Pair è solo una struttura con due campi, che non hanno un nome speciale (a differenza Person). Le coppie (e più in generale le tuple) sono spesso usate in linguaggi come Python quando non si vuole dare un nome ad alcune strutture intermedie. Nel tuo caso, invece di (possibilmente) sotto-definito Person oggetto hai un semplice oggetto completamente definito.Forse l'uso di Pair è discutibile in Java, a causa di una sintassi piuttosto maldestra (confrontare con Python, dove la coppia sarebbe solo ("Religion", religions)).

  2. Si può pensare a Map come una raccolta di coppie con il vincolo univoco sul primo elemento.

6

Penso che la questione si sta chiedendo è: qual è la differenza tra List<Pair<T,S>> e HashMap<T,S>. Ci sono molti.

In generale, un oggetto Map viene utilizzato per associare un valore a una chiave e fornire i mezzi per ottenere rapidamente i valori in base alla chiave. Di solito può esserci un singolo valore associato a una chiave.

A List è un contenitore ordinato in cui sono memorizzati oggetti, fornisce mezzi per scorrere il suo contenuto e ottenere un elemento in base alla sua posizione nell'elenco (ottenere l'elemento Nth). Di solito gli stessi elementi possono essere duplicati all'interno di un elenco.

Nel tuo caso, quando si utilizza un elenco, i pazienti possono avere diverse religioni. Per trovare che tipo di religione ha il tuo paziente, devi cercare manualmente l'elenco per la coppia con il primo elemento impostato per religione.

Se si fosse utilizzata una mappa, a ciascun paziente sarebbe associata una singola religione (o nessuna). Puoi anche trovare rapidamente la religione attraverso Map<String,String>.get(String key)

+0

Un modello che supporta diverse religioni a persona --- che bella idea per insegnare il significato di * overengineering *! –

+0

@MarkoTopolnik è un esempio sfortunato, mi spiace:/Ma immagino che la memorizzazione di numeri di telefono o di altre 1-molte entità sia possibile in "patientDetails". – Dariusz

+0

Ho dimenticato di mettere uno smiley, mi dispiace :-) L'ho scritto per le risate. –

1

La classe Pair può essere paragonata allo Map.Entry di una HashMap. Una HashMap può contenere più coppie chiave/valore memorizzate e cercate in modo efficiente dalla chiave.

Un elenco di coppie non può essere cercato dalla chiave senza iterazione inefficiente (a seconda della dimensione), ma può essere fatto riferimento all'indice. C'è anche nulla che impone una e una sola chiave nella lista.

Problemi correlati