O hartă hash în care unul dintre câmpurile obiectului valoare este cheia?

Mă întrebam dacă există o clasă ca HashMap în care cheia este un câmp de identificare în obiect.

Dacă nu există, m-am gândit să folosesc clasa pe care o folosesc ca valoare implementând Map.Entry. Aceasta pare a fi o abordare rezonabilă sau pare a fi periculoasă? (Voi face câmpul meu imuabil.)

1
În al doilea rând, conceptul meu de a face valoarea implementa Map.Entry nu este viabil deoarece Map.Entry are o metodă publică setValue (). Din moment ce nu pot stabili "această" pentru a fi o altă valoare, nu se poate face cu adevărat.
adăugat autor Joe, sursa
Cum arata obiectul dvs.?
adăugat autor Bhesh Gurung, sursa
De ce ai nevoie de o hartă specială pentru asta? Creați o clasă V , dați-i un câmp membru K și creați un Map .
adăugat autor Nate W., sursa

4 răspunsuri

M-am gândit să folosesc clasa pe care o folosesc ca valoare implementând Map.Entry. Aceasta pare a fi o abordare rezonabilă sau pare a fi periculoasă?

Periculoși sau nu, este un design rău, deoarece acesta încalcă principiul responsabilității unice . O clasă nu ar trebui să fie responsabilă pentru a-și face propriile lucruri și, de asemenea, să fie un Map.Entry. Ce se întâmplă atunci când doriți să o utilizați în altă bibliotecă? Trebuie să implementați o altă interfață?

Deși nu îmi este clar ce sper să câștigi implementând Map.Entry (încerci să extinzi AbstractMap ?), Pot să-ți spun că miroase rău pentru mine și eu nu au văzut-o niciodată în practică.

Care este problema actuală aici? Ce este în neregulă cu utilizarea unui HashMap ?

Map map = new HashMap();
MyClass myObj = new MyClass("myId");

//...
map.put(myObj.getIdentifier(), myObj);

MyClass retrievedObj = map.get("myId");
4
adăugat
Cred că punctul dvs. de bază este corect. Încercam doar să fac lucrurile mai puțin verbose, dar în acest proces am fost, probabil, un pic de fantezie.
adăugat autor Joe, sursa

Când adăugați obiecte (sau clase) la hashmap, selectați tasta feild trimisă pe hartă. Faceți o metodă getKey() în interiorul clasei dvs., care vă va reveni la cheia dorită.

Apoi, utilizați-l când inserați un obiect pe hartă

De exemplu, dacă aveți o cheie personală cu ID (String) ca cheie. Faceți această funcție:

public String getKey()
{
   return this.Id; //Or use the getter method
}

Utilizați-l la introducerea obiectului Person pe hartă:

Person1.getKey();
3
adăugat
@Shakedown Vă mulțumim pentru nota bună.
adăugat autor Alon Adler, sursa
Aceasta este o abordare bună. Cred că o să folosesc asta.
adăugat autor Joe, sursa
Îmi place să denumesc metode după ceea ce fac/sunt, nu pentru ce vor fi folosite. Ce veți face atunci când doriți să creați o serie de obiecte Person , adăugați o metodă getIndex() la Person ? Aș recomanda să nu-ți numești metoda getKey() deoarece aproape că o vei folosi într-un context care este pentru altceva decât o cheie în hartă. Dacă getKey() va întoarce ID-ul persoanei, atunci nu este nevoie de getKey() , folosiți getId() .
adăugat autor Nate W., sursa

Puteți folosi întotdeauna HashMap și adăugați câmpul ca cheie (dacă urmați să faceți acest lucru imuabil oricum, nu văd nici o problemă cu asta).

0
adăugat

Este HashMap în sine. Doar asigurați-vă că "câmpul de identificare" din obiect implementează metodele equals() și hashCode() .

de exemplu. Dacă clasa ta este:

public class YourObject {
    private String identifyingField;

Atunci:

Map yourMap = new HashMap();
0
adăugat