Ich programmiere momentan ein kleines Programm, in welchem ich extrem viele
Objekte habe. (1 Chunk = 16*16*256).
Und ich habe so ca. 100 Chunks vllt.
Meine Frage ist aber nur ob es möglich ist meine Objekte in einer Hashmap zu speichern, und der Key ist dann deren Position selber. Und wenn sich die Objekte zum beispiel bewegen, dass sich ebenfalls die Keys verändern ?
Also angenommen ich speicher in der Hashmap eine Kugel mit der Position p,
Und das mach ich dann vllt 100 mal. Jeweils mit einer anderen Position. Und jetzt bewege ich alle Objekte irgendwie. Wenn ich jetzt frage, welches Objekt ist an der Stelle x,y. Dann soll mir auch das objekt an der Stelle ausgespuckt werden.
Also ist der Key im Prinzip ein Teil des Objektes selber. Ist das möglich ?
Oder gibt es ggf. bessere Möglichkeiten um mein Problem zu lösen?
Nein, das geht nicht. Der Key in der Hashmap ist die Objektreferenz, genauer gesagt System#identityHashCode(Object). Wenn sich eine Eigenschaft des Keys ändert, ändert sich an der Hashmap nichts.
Also Ich habe theoretisch, meine ganzen Objekte. Und ich muss alle Objekte in einem bestimmten Radius von einer Stelle bekommen. Und das wäre ziemlich einfach wenn ich jeweils die Position hätte.
Ansonsten muss ich darauf verzichten, dass sich die Objekte bewegen können und nehme einfach die Position des Arrays ^^
Ui.... okay.
das ist schlecht :S aber danke für die schnelle Antwort ! Das Problem ist, dass implementiere ich in ein Spiel und das muss halt ziemlich schnell gehen. Und wenn er (gefühlt) 10000 Objekte durchsucht dann kann ich mit meinem CPU gleich ein Schnitzel braten
Was du vorhast, ist möglich. Allerdings kann ich nicht beurteilen, ob du damit das, was du dir erwartest, auch erreichst.
Also einfach ausprobieren und testen ;-)
Du kannst dabei folgendermaßen vorgehen:
+ Die HashMap verwendet die Koordinaten eines Nodes als Key (zB: key = x * a + y; wobei a eine Konstante ist, die größer als jeder x-Wert)
+ Jeder Node, den du in die HashMap aufnimmst, hält auch eine Referenz auf die HashMap.
+ Bei einer Positionsänderung (setX / setY / setXY) sorgen die Setter dafür, dass das Objekt unter Verwendung der "alten" xy-Koordinaten aus der HashMap entfernt wird und an der "neuen" Position wieder eingefügt wird.
Wie du siehst, hast du dadurch eine starke Abhängigkeit zwischen den Nodes und der HashMap. Üblicherweise versucht man das eher zu vermeiden.
Wollte ich auch gerade sagen. Solange du im Loop nicht anfängst physikalische konstanten zu berechnen sollte das kein Performance-Problem sein. Und ja, der QuadTree kann helfen. Siehe auch ECS.