Een hash-kaart waarin een van de velden van het waardeobject de sleutel is?

Ik vroeg me af of er een klasse zoals HashMap was waarin de sleutel een identificerend veld in het object is.

Als dat niet het geval is, was ik aan het denken om de klasse die ik gebruik als de waarde Map.Entry te laten implementeren. Lijkt dit een redelijke benadering of lijkt dit gevaarlijk? (Ik zal mijn toetsveld onveranderlijk maken.)

1
Bij nader inzien is mijn concept van het maken van de waarde van Map.Entry niet haalbaar omdat Map.Entry een openbare methode setValue() heeft. Omdat ik "dit" niet kan instellen als een andere waarde, kan het niet echt worden gedaan.
toegevoegd de auteur Joe, de bron
Hoe ziet je object eruit?
toegevoegd de auteur Bhesh Gurung, de bron
Waarom zou je hiervoor een speciale kaart nodig hebben? Maak een klasse V , geef deze een lidveld K en maak een kaart .
toegevoegd de auteur Nate W., de bron

4 antwoord

Ik dacht erover om de klasse die ik gebruik als de waarde Map.Entry te laten implementeren. Lijkt dit een redelijke benadering of lijkt dit gevaarlijk?

Gevaarlijk of niet, het is een slecht ontwerp, omdat het in strijd is met het principe voor één verantwoordelijkheid . Een klasse moet niet verantwoordelijk zijn voor het doen van zijn eigen dingen, en ook een Map.Entry zijn. Wat gebeurt er als je het nu in een andere bibliotheek wilt gebruiken? Moet u een andere interface implementeren?

Hoewel het voor mij onduidelijk is wat u hoopt te winnen door Map.Entry te implementeren (probeert u AbstractMap uit te breiden?), Kan ik u zeggen dat dit slecht voor mij is en ik heb het nog nooit in de praktijk gedaan.

Wat is hier het probleem? Wat is er mis met het gebruik van een HashMap ?

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

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

MyClass retrievedObj = map.get("myId");
4
toegevoegd
Ik denk dat je belangrijkste punt klopt. Ik probeerde alleen maar de dingen minder uitgebreid te maken, maar in het proces was ik waarschijnlijk een beetje te chique.
toegevoegd de auteur Joe, de bron

Wanneer u objecten (of klassen) aan de hashmap toevoegt, selecteert u het sleutelveld dat naar de kaart wordt verzonden. Maak gewoon een getKey() -methode in je klas die je gewenste sleutel retourneert.

Gebruik het dan wanneer u een object op de kaart invoegt

Bijvoorbeeld als u een persoonsklasse met ID (String) als sleutel hebt. Maak deze functie:

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

En gebruik het bij het invoegen van het Person-object op de kaart:

Person1.getKey();
3
toegevoegd
@Shakedown Bedankt voor het goede nieuws.
toegevoegd de auteur Alon Adler, de bron
Dat is een goede benadering. Ik denk dat ik dat zal gebruiken.
toegevoegd de auteur Joe, de bron
Ik hou ervan methoden te benoemen naar wat ze doen/zijn, en niet waar ze voor worden gebruikt. Wat ga je doen als je een array met Person -objecten wilt maken, ga je een getIndex() -methode toevoegen aan Persoon ? Ik raad je aan om je methode getKey() niet te benoemen omdat je deze bijna zeker zult gebruiken in een context die voor iets anders dan een sleutel op je kaart is. Als uw getKey() de id van de persoon zal retourneren, is getKey() niet nodig, gebruik getId() .
toegevoegd de auteur Nate W., de bron

Je zou altijd HashMap kunnen gebruiken en het veld als de sleutel kunnen toevoegen (als je het toch onveranderlijk zou maken, zie ik daar geen enkel probleem mee).

0
toegevoegd

Het is de HashMap zelf. Zorg ervoor dat het "identificatieveld" in het object de methoden equals() en hashCode() correct implementeert.

bijv. Als je klas is:

public class YourObject {
    private String identifyingField;

Dan:

Map yourMap = new HashMap();
0
toegevoegd