Zwei Hashtables statt einer?

Status
Nicht offen für weitere Antworten.

LoN_Nemesis

Bekanntes Mitglied
Hallo,

folgendes Szenario:

Ich habe eine eigene Klasse mit relativ vielen Variablen(~50 ints, 5 Strings und einige booleans). Davon erzeuge ich dann Instanzen, maximal sind es ca. so bis 100 Stück auf einmal. Ich verwalte diese in einer Hashtable und benutze als Schlüssel java.awt.Point, da ich sehr oft die Überprüfung machen muss, ob an einer bestimmten Stelle eine dieser Instanzen ist. Aber nun muss ich auch noch ziemlich oft überprüfen, ob ein NPC (das ist meine Klasse) noch lebt. Das mache ich über den Namen, denn der ist eindeutig. Allerdings ist es nun ziemlich ineffizient, wenn ich die Hashtable von vorne bis hinten durchsuchen muss, da ich ja als Schlüssel nur die Position habe. Die verändert sich aber im Laufe der Zeit und ist deshalb kein eindeutiger Identifikator für eine Instanz.

Sollte ich eine zweite Hashtable anlegen, mit dem gleichen Inhalt der ersten und hier den Namen als Schlüssel verwenden? Denn eigentlich speichert die Hashtable ja nur Referenzen auf Objekte wenn ich das richtig verstanden habe, also sollte doch der Speichermehrbedarf nicht so gravierend sein? Oder täusche ich mich und ich sollte statt einer Hashtable lieber eine andere Datenstruktur nehmen, bei der man für beide Suchen die gleiche Zeit hätte?
 
A

Anmeldeboykottierer

Gast
LoN_Nemesis hat gesagt.:
Denn eigentlich speichert die Hashtable ja nur Referenzen auf Objekte wenn ich das richtig verstanden habe, also sollte doch der Speichermehrbedarf nicht so gravierend sein?

Hi, an sich werden nur Referenzen gespeichert, egal wo. Das hat halt ganz generell einige Vorteile, aber das ist ein Thema für sich.

Was dein Problem angeht, du hast nur ca. 100 Instanzen? Da kannst du mit dem Weg auf jeden Fall arbeiten. Der Speicherbedarf für eine Referenz beträgt 4 Byte oder du jetzt also 400 oder 800 Byte belegen würdest, dass merkst du gar nicht an Unterschied.
Das Hauptproblem dürfte eher die Perfomance sein. Hier ist es wichtig sich die (möglichen) Datenstrukturen genauer anzuschauen.
Im Fall einer Hashlist geht das finden eines Eintrags sehr schnell. Du berechnest halt den Hash, schaust an der berechneten Position nach, alles linear. Das Problem ist es, dass du zwei Listen konsistent halten musst. Das was bei einer Hashlist zeit kostet ist das Berechnen der Hashes. Man möchte natürlich nicht den gesamten Speicher einfach mal für eine Hashtable verwenden, sondern möglichst nur die Menge an Speicher reservieren (und entsprechende Hashes berechnen), wie gerade benötigt werden. Dann wird die Map dyn. erweitert, neue Hashes erstellt und die alten Einträge entsprechend neu angeordnet.
Bei zwei Maps hast du also diesen Overhead auch gleich 2x.
Du siehst, dass hier irgendwann der Overhead größer werden dürfte als wenn du über eine Liste iterierst. Ohne hier sagen zu können und auch zu wollen, wann genau das der Fall wäre, bei gerademal zwei Listen und in der Größenordnung dürfte es noch lange nicht der Fall sein.
Da sollte aber auch das Durchsuchen von 100 Einträgen nicht wirklich viel Zeit kosten, hättest du ein paar zig-tausend NPCs, dann sieht dass eher anders aus.

Gruß Der Anmeldeboykottierer
 

LoN_Nemesis

Bekanntes Mitglied
Hallo,

vielen Dank für die Antwort. Ich werde nun 2 Hashtables führen. Das von dir angesprochene Problem tritt ja nur auf, wenn die Hashtable verändert wird, also wenn Objekte hinzukommen. Das passiert aber eigentlich alles nur einmal, also wenn ich das Level lade dann füge ich alle NPCs zu der Hashtable dazu. Während der "Hauptschleife" des Programmes wird dann nur sehr selten ein NPC hinzugefügt oder gelöscht, ich denke da kann ich auch locker 2 Hashtables führen.
 

LoN_Nemesis

Bekanntes Mitglied
Ähm da fällt mir ein, was passiert eigentlich wenn sich die Position eines NPCs verändert? Dann hat er neue Koordinaten, steht aber in der Hashtable immer noch mit den alten drin oder was?
 

Leroy42

Top Contributor
LoN_Nemesis hat gesagt.:
steht aber in der Hashtable immer noch mit den alten drin oder was?

Die Hashtable verwaltet nur Referenzen, wenn sich nur die Instanzvariablen
deiner NPC-Instanzen ändern und du kein new NPC(...) aufrufst, sind auch die
in deiner Hashtable stehenden NPCs mitverändert, da es sich eben um ein-
unddasselbe Objekt handelt.
 

LoN_Nemesis

Bekanntes Mitglied
Hm, das verstehe ich nicht so ganz. Mein Schlüssel sind die Koordinaten einer Instanz. Soweit ich über Hashtables Bescheid weiss, berechnet sich der Hashwert (und damit der Speicherort eines Elementes) direkt aus dem Schlüssel.

Nehmen wir also an, ich plaziere einen NPC (einen Hufschmied!) an den Welt Koordinaten (13,97) und übergebe das Schlüssel/Wert Paar der Hashtable. Angenommen diese hat die Kapazität 10 und der berechnete Hashwert ist 8, der Hufschmied wird nun also an Position 8 gespeichert. Wenn sich nun seine Koordinaten ändern, dann würde sich auch sein Schlüssel ändern. Also der Hufschmied bewegt sich nun, sagen wir er geht in eine Taverne. Gleichzeitig erschaffe ich an der alten Position des Hufschmiedes einen neuen NPC, per geskriptetem Ereignis oder so. Dann gebe ich diese in die Hashtable, die dann folgende Feststellung trifft: Ah der Schlüssel ist bereits vorhanden, also überspeichere ich den alten Wert. Das ist aber falsch, denn in Wirklichkeit sollen beide NPCs in der Table sein, was auch kein Problem darstellt, da sie unterschiedliche Positionen haben.

Hm, doch lieber eine stinknormale Liste? :p Oder verstehe ich was falsch?
 
S

SlaterB

Gast
wenn sich der Schlüsse ändert, hat die Map natürlich ihre Probleme, da hast du schon recht,

nur allgemein gilt, dass es kein Problem ist, ein Objekt in der Map in einem anderen Kontext zu benutzen/ ändern,
wenns aber den Schlüssel betrifft..

naja du wirst schon wissen was du tust, hast ja selber die Probleme beschrieben
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
D Zwei Listen vergleichen Allgemeine Java-Themen 7
Tobero Wie berechnet man ob zwei Linien sich schneiden? Allgemeine Java-Themen 2
kodela Zwei gleichzeitig gedrückte Steuertasten Allgemeine Java-Themen 10
X Bedingung zwei mal überprüfen Allgemeine Java-Themen 4
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
K Aus String zwei Jahreszahlen auslesen Allgemeine Java-Themen 18
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
VfL_Freak Double mit zwei festen NK-Stellen ausgeben Allgemeine Java-Themen 9
Neoline Methoden Zwei Arrays abwechselnd zusammenführen Allgemeine Java-Themen 15
J Zwei Wavdateien gleichzeitig mit SourceDataLine abspielen Allgemeine Java-Themen 0
D Best Practice Die niedrigste Differenz zwischen zwei Listen ermitteln. Allgemeine Java-Themen 10
J Fahrroute zwischen zwei Punkten finden Allgemeine Java-Themen 1
J Kollision von zwei Kreisen Allgemeine Java-Themen 15
J Transfer von Integer zwischen zwei Clients - RMI Allgemeine Java-Themen 4
S Variablen split-Funkton mit zwei Variabeln verwenden? Allgemeine Java-Themen 4
T Alle Kombinationen aus zwei Arrays Allgemeine Java-Themen 8
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
AssELAss Zwei Arrays / ArrayLists inhaltlich vergleichen Allgemeine Java-Themen 2
H RegularExpression zwischen zwei Strings Allgemeine Java-Themen 2
P Zwei Applikationen mit einem Job Allgemeine Java-Themen 0
A Lineare Interpolation mit zwei Arrays Allgemeine Java-Themen 4
E Berechnung des Schnittpunktes von zwei Geraden Allgemeine Java-Themen 1
S Zwei String vergleichen, Fehler markieren Allgemeine Java-Themen 3
G Matrix reduzieren zwei Methoden Allgemeine Java-Themen 2
Dechasa Vergleichen von zwei Arrays Allgemeine Java-Themen 4
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
S Anwendung zum ausrechnen der Differenz von zwei Tagen Allgemeine Java-Themen 9
F Zwei LinkedHashMaps iterieren und vergleichen Allgemeine Java-Themen 2
M Zwei unterschiedliche JAR Dateien mit ANT erstellen Allgemeine Java-Themen 8
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
L Zwei Files miteinander vergleichen und Grafisch darstellen Allgemeine Java-Themen 1
T Zwei Wortendungen vergleichen ohne .equals Allgemeine Java-Themen 10
F Webstart zwei Java Versionen / aktivieren bzw deaktivieren Allgemeine Java-Themen 2
S Zwei Comparable (compareTo) vergleichen Allgemeine Java-Themen 6
E zwei Gleitkommazahlen durcheinander dividieren Allgemeine Java-Themen 2
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
turmaline OOP zwei gleiche Methoden mit kleinen Unterschieden Allgemeine Java-Themen 15
C Threads Zwei Threads greifen auf LinkedList zu. Allgemeine Java-Themen 12
T Wie heißt ein Binärbaum, dessen Knoten immer zwei Kinder haben müssen? Allgemeine Java-Themen 2
C ActionListener zwei Buttons zuweisen Allgemeine Java-Themen 11
M Eclipse drei slashs durch zwei ersetzen? Allgemeine Java-Themen 3
1 zwei Strings vergleichen Allgemeine Java-Themen 16
C Buchstaben, die in zwei Wörtern vorkommen Allgemeine Java-Themen 13
J Gleiche Packagestruktur in zwei *.jar Dateien Allgemeine Java-Themen 4
G Zwei bytes vergleichen Allgemeine Java-Themen 2
B zwei-dimensionale Collections bzw. Array mit Indizes Allgemeine Java-Themen 3
C Zwei Arrays vereinen Allgemeine Java-Themen 3
K Objekt-Austausch zwischen zwei Programmen über System-Clipboard Allgemeine Java-Themen 5
H Zwei verschiedene Dateien mittels einem Binärstream übertragen? Allgemeine Java-Themen 13
N hashCode() für zwei ints Allgemeine Java-Themen 5
turmaline Gleichheit von zwei Maps Map <String, Map <String, String>> Allgemeine Java-Themen 30
N Wie Listenabgleich auf zwei CPU Cores auslagern? Allgemeine Java-Themen 6
D Zufall wahr bzw. falsch mit zwei Faktoren Allgemeine Java-Themen 10
H Datenaustausch zwischen zwei Java-Programmen Allgemeine Java-Themen 5
H Ausgabe von zwei Textfeldern Allgemeine Java-Themen 3
H Zwei unabhängige Threads miteinander kommunizieren lassen Allgemeine Java-Themen 3
G zwei mal synchronized Allgemeine Java-Themen 5
Z zwei Daten vergleichen Allgemeine Java-Themen 4
C ArrayList anhand von zwei Attributen sortieren Allgemeine Java-Themen 4
S Alle Elemente von zwei Listen vergleichen Allgemeine Java-Themen 10
T IText: Zwei A4 PDF´s auf ein A3 PDF´s Allgemeine Java-Themen 2
J Verschachtelte ListIteratoren um in zwei Listen hin und herzugehen Allgemeine Java-Themen 5
A Differenz zwischen zwei Uhrzeiten Allgemeine Java-Themen 7
H Shortcut ruft zwei Menu-punkte auf Allgemeine Java-Themen 5
J Zwei konstruktoren? Allgemeine Java-Themen 8
A zwei listen vergleichen und unterschiede anzeigen Allgemeine Java-Themen 3
J Zwei sortierte Listen zusammenfassen Allgemeine Java-Themen 8
G Linked List zwischen zwei Threds übergeben Allgemeine Java-Themen 11
J zwei HashMaps vereinen Allgemeine Java-Themen 3
C Viele Informationen aus zwei Collections vergleichen Allgemeine Java-Themen 2
G Jfreechart zwei charts Allgemeine Java-Themen 2
S Zwei Anwendungen unter Tomcat Allgemeine Java-Themen 4
T Anzahl Tage zwischen zwei Daten - Stunde fehlt? Allgemeine Java-Themen 2
V Zwei ArrayList(s) vergleichen Allgemeine Java-Themen 6
T Überprüfen ob zwei Farben ähnlich sind Allgemeine Java-Themen 14
M zwei main-Methoden Allgemeine Java-Themen 7
P zwei JFrames zusammenhängen Allgemeine Java-Themen 4
A Summe und Produkt von zwei Feldern ( arrays) Allgemeine Java-Themen 9
M HashMap kapselt zwei Objekte aber wie baut man eine Matrix? Allgemeine Java-Themen 2
H zwei Date Variablen überschreiben sich Allgemeine Java-Themen 2
2 Tage zwischen zwei Datumsdaten zählen Allgemeine Java-Themen 2
G Tage zwischen zwei Datumsdaten zählen Allgemeine Java-Themen 3
J Zwei String auf ähnlichkeiten untersuchen? Allgemeine Java-Themen 3
C kürzester weg zwischen zwei Punkten, Koordinaten finden Allgemeine Java-Themen 15
B zwei Bilder miteinander vergleichen Allgemeine Java-Themen 25
L Anzahl Tage zwischen zwei Kalenderdaten Allgemeine Java-Themen 5
P Threadprogrammierung - zwei Threads parallel - einer beendet Allgemeine Java-Themen 3
G Kommunikation von zwei Java-Programmen Allgemeine Java-Themen 3
A Zusammenfassen von zwei Dateien (wie beim DOS-Befehl copy) Allgemeine Java-Themen 6
S zwei Arrays zusammenfassen Allgemeine Java-Themen 14
M zwei Threads - ein singleton-Objekt Allgemeine Java-Themen 3
A funktion schiffeZeichnen zwei mal aufrufen Allgemeine Java-Themen 16
G zwei Rückgabewerte gefordert. Was tun ? Allgemeine Java-Themen 10
Chucky Zwei Binärbäume vereinigen Allgemeine Java-Themen 7
B Fehler:Mein Applet kann nicht auf zwei txt-Dateien zugreifen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben