2 Stimmen

Eine Java-Hash-Map auch dann verwenden, wenn es kein "Mapping" gibt?

Ich möchte einige Objekte speichern und sie später so effizient wie möglich abrufen können. Ich werde auch einige von ihnen unter bestimmten Bedingungen entfernen. Es scheint, dass eine Hash-Map die richtige Wahl wäre.

Aber, von dem, was ich gesehen habe, Hash-Maps immer einen Wert mit einem anderen assoziieren? Zum Beispiel, "john" und "555-5555", seine Telefonnummer.

Nun zu meiner Situation. Nehmen wir an, ich habe eine Reihe von Personen, und jede Person ist mit anderen Personen verbunden. Ich muss also für jede Person ihre Kontakte speichern.

Was ich mache, ist, dass jede Person ein Hash-Map hat, und dann würde ich dem Hash otherPerson, otherPerson hinzufügen. Im Grunde genommen ist der Schlüssel der Wert. Mache ich das falsch?

EDIT Ich glaube nicht, dass das HashSet mein Problem lösen würde, da ich den Wert abrufen muss, um ihn zu aktualisieren, und es keine get-Methode gibt. Remove gibt einen booleschen Wert zurück, so dass ich ihn nicht einmal entfernen kann, um ihn wieder zurückzusetzen, was wahrscheinlich ohnehin eine schlechte Idee wäre.

3voto

bryantsai Punkte 3355

Wenn Sie nur prüfen wollen, ob A zu den Kontakten von B gehört, dann ist Set die richtige Wahl. Es hat contains() für diesen Zweck.

Andernfalls wäre Map am besten geeignet, da Sie einen effizienten Abrufvorgang benötigen. Sie sagten, dass Sie derzeit dasselbe Objekt als Schlüssel und Wert verwenden, aber ich bin nicht sicher, wie Sie den Schlüssel überhaupt erhalten. Angenommen, Sie möchten den Kontakt A aus den Kontakten von B abrufen und verwenden etwas wie "B.contacts.get(A)", woher bekommen Sie dann A? Wenn man A bereits hat, woher soll man es dann noch einmal aus der Karte holen? (Vielleicht gibt es mehrere Instanzen der gleichen Person?)

Es sei denn, es gibt mehrere Instanzen der gleichen Person, würde ich sagen, für jede Person, definieren Sie eine ID wie eindeutiges Attribut, und verwenden Sie das als Schlüssel für die Kontakte zuordnen. Definieren Sie außerdem equal()/hashCode() für die Personenklasse? Map/Set verwendet hashCode() und equal(), um die Übereinstimmung zu finden. Abhängig von Ihrer Verwendung müssen Sie möglicherweise in Betracht ziehen, sie aus Effizienzgründen neu zu schreiben.

2voto

Joey Punkte 329386

Nun, die Datenstruktur, die Sie hier suchen würden, wäre ein HashSet (oder eine andere Art von Satz), ich denke (wenn Ihr Framework/Bibliothek bietet es). Ein Set sagt einfach "Ich habe die folgenden Elemente" anstatt "Ich habe die folgenden Elemente, die den folgenden Werten zugeordnet sind". Das wäre das, was Sie hier modellieren.

Wie für HashSet vs. andere Implementierungen (falls vorhanden): Das hängt alles davon ab, was Sie tun. Wenn Sie eine schnelle Suche benötigen, d. h. Fragen wie "Ist dieses Element in der Menge?", dann ist Hashing eine gute Sache. Andere zugrundeliegende Datenstrukturen sind vielleicht besser für andere Mengenoperationen optimiert, wie Vereinigung, Schnittmenge usw.

2voto

John Feminella Punkte 292907

Eine Hash-Tabelle/Map erfordert lediglich, dass Sie eine Möglichkeit haben, die Werte zu erhalten, die Sie später nachschlagen möchten; dafür ist der Schlüssel da.

In Ihrem speziellen Fall hört es sich jedoch so an, als ob Sie nach einer Möglichkeit suchen, Beziehungen zwischen Personen zu speichern, und was Sie im Auge behalten wollen, ist, ob Person A eine Beziehung zu Person B hat oder nicht. Adjazenzliste .

2voto

Stephen C Punkte 665668

Ich glaube nicht, dass das HashSet mein Problem lösen würde, weil ich den Wert abrufen muss, um ihn zu aktualisieren, und es gibt keine get-Methode.

Dies ist eine rätselhafte Aussage. Warum sollte man einen Wert mit einer get Methode, um sie zu aktualisieren? Wenn Sie wissen, welches Objekt Sie aus der Menge/Karte abrufen müssen, brauchen Sie es nicht abzurufen.

Zum Beispiel:

HashSet<Person> relations = ...
Person p = ...
if (relations.remove(p)) {
    // we removed an object such that p.equals(obj) is true.
}

Wenn Sie sich nun Sorgen machen, dass das entfernte Objekt gleich war, aber nicht identisch mit p scheint mir, dass mit Ihrem Entwurf etwas nicht stimmt. Entweder:

  • sollten Sie nicht mehrere Person Instanzen, die gleich sind, oder
  • Sie sollten sich nicht darum kümmern, dass Person Instanzen nicht identisch sind, oder
  • sollten Sie nicht überschrieben haben equals(Object) .

Kurz gesagt, das Problem ist, dass Sie die Objektidentität nicht richtig verwalten.

0voto

JRL Punkte 74309

Übersehe ich etwas oder brauchen Sie nicht einfach eine ArrayList<Person> ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X