Java - Datenstruktur für/als erweiterbares 2D-Array?
Hi, ich stehe gerade vor folgendem Problem. Ich trage in ein 2D-Array nach und nach Farbwerte ein. Dabei weiß ich vorher nicht wie groß das Array sein muss, noch ob ich bei [0][0] anfangen kann oder ob später noch Farbwerte auf Positionen kleiner als 0 gespeichert werden müssen.
Einfach ein sehr großes 2D-Array zu erstellen und in der Mitte anzufangen kommt nicht in Frage, allein weil dieses eventuell auch noch zu klein sein könnte.
Ich könnte natürlich auch erstmal ein kleineres Array nehmen und es jedes Mal wenn nötig auf ein größeres kopieren, aber ich glaube ich muss nicht erklären wieso das keine Option ist.
Ein Idee hatte ich allerdings, die zumindest einen guten Ansatz hat, und zwar einfach eine Liste (z.B. eine ArrayList oder Queue) in der ich alle neuen Einträge einfach anhänge. Nur leider landen mit dieser Methode eventuell ein paar unnötige Einträge in der Liste, nämlich immer dann wenn ich auf eine Position ([x][y]) mehr als einmal etwas speichere.
Konkrett brauche ich also eine Datenstruktur mit möglichst schneller Einfüge- und Zugriffszeit, die ich in irgendeiner Weise wie ein 2D-Array/Raster behandeln kann.
Falls da jemandem eine Lösung für einfällt wäre ich sehr dankbar.
LG Jesaja
Um ein wenig klarer zu machen versuche ich mal etwas mehr zu erklären.
Mein Bildschrim besteht aus 384 x 216 Pixeln, wobei diese Zahlen von zwei finalen Variablen abhängig sind, dass ist für meine Frage allerdings unwichtig. Wenn ich eine Form, zum Beispiel ein Rechteck auf den Bildschrim bringen will, geschieht das nicht direkt über OpenGL (welches in meinem Projekt eingebettet ist) sondern wird mit einer eigenen Methode errechnet, dann, vereinfacht gesagt, auf ein 2D-Farb-Array gespeichert und später erst mit OpenGl auf den bildschirm gebracht.
Wenn ich jetzt versuche eine Form, ein wenig oder ganz ausserhalb des Bildschirms zu zeichnen werden die nicht sichtbaren Pixel einfach ignoriert, sprich nicht gezeichnet.
Jetzt will ich allerdings, aus Gründen die ihr in meiner letzten Frage erfahrt, diese Formen (nicht nur eine Form sondern unterschiedlichste Grafiken) auch ausserhalb des Bildschirms zeichnen können (sie werden nicht wirklich auf den Bildschirm gezeichnet, sondern auf eine weitere Datenstruktur).
Und da ich im Vorhinein nicht weiß wo und wie groß diese Formen sein werden, ist der logische Schluss, dass ich eine Datenstruktur brauche die einfach und vor allem schnell erweiterbar ist.
4 Antworten
Map<Pos, Color>
class Pos(val x, val y)
oder
List<PosColor>
class PosColor(val x, val y, val color)
void set(PosColor pc) {
val index = list.first { it.x == pc.x && it.y == pc.y}
if(index == -1) list.add(pc);
else list.set(index, pc);
}
oder so ähnlich
Ein Dictionary, wobei du als Key einen kombinierten x- und y-Wert verwendest, wäre eine Möglichkeit. Also z.B. x * 100000 + y, je nach Wertebereich (oder x << 32 or y etc)
Wäre es nicht umgekehrt besser?:
Du hast ein 2D Array von z.B. 1000x1000 und hast eine Box des 'sichtbaren' Ausschnittes. Datenstrukturen mit hoher Dynamik undn vielen Änderungen gibt es kaum mit guter armortisierter Laufzeit.
Dazu kommt, daß Java denkbar ungeeignet für derartiges ist - wenn ich ein Feld effizient erweitern möchte erfordert das hochperformante move-Operationen im Speicher.
Die Frage ist ja eher eine andere:
Warum willst du in einem Offscreen außerhalb des sichtbaren Bereichs zeichen und warum kannst Du nicht abschätzen, wie groß dieser virtuelle Screen ungefähr sein muß.
Ich versuche noch die Anwendugn zu verstehen und ob das Vorgehen sinnvoll ist, oder eventuell der Entwurf krankt und man es ganz anders angehen sollte (oder könnte).
Dazu solltest Du noch erklären, was dein Anwendungsfall genau ist und wieso du nicht genau weißt, wo du die Werte einfügen willst. Insbesondere wieso sie vor 0,0 liegen können.
Wahrscheinlich ist eine Hashtable, ein Dictonary oder eine dünn besetzte volle x*y-Matrix (Feld) was du brauchen kannst)
Falls ich den Oberen Abschnitt richtig verstanden habe, und du meinst das ich den sichtbaren Teil mit einem anderen größeren Teil umrahmen soll, dann muss ic leider sagen, dass das zwar besser als ohne Rand wäre, aber trotzdem nicht so universell einsetztbar wie ich brauche, denn leider kann ich nicht wissen ob eine From jetzt 20, 200, 2000 Pixel vom sichtbaren Rechteck weg gezeichnet werden soll.
Mit dem zweiten Abschnitt hast du leider recht, aber daran kann ich nichts ändern und die Sprache zu wechseln macht nur deshalb auch keinen Sinn, ich lerne immernoch die Grundfeste von Java kennen, jetzt umzusteigen fände ich daher sinnlos.