2

Ich bin gerade dabei, einen OBJ-Importer für ein OpenGL-Android-Spiel zu erstellen. Ich bin relativ neu in der Sprache Java, also bin ich mir über einige Dinge nicht im Klaren.Füllen nicht initialisierte Array in Java? (oder Workaround!)

Ich habe ein Array, das die Anzahl der Scheitelpunkte im Modell (zusammen mit ein paar anderen Arrays als auch) halten wird:

float vertices[]; 

Das Problem ist, dass ich weiß nicht, wie viele Ecken gibt es im Modell, bevor ich die Datei mit dem Eingangsstrom gelesen habe, der mir gegeben wurde.

Würde ich in der Lage sein, es zu füllen, wie ich dies ?:

vertices[95] = 5.004f; //vertices was defined like the example above 

mögen müssen, oder muss ich es vorher initialisieren?

Wenn letzteres der Fall ist, was wäre dann ein guter Weg, um die Anzahl der Scheitelpunkte in der Datei herauszufinden? Sobald ich es mit inputstreamreader.read() gelesen habe, geht es in die nächste Zeile, bis es die ganze Datei liest. Das einzige, was mir einfällt, wäre, die ganze Datei zu lesen, die Anzahl der Scheitelpunkte zu zählen und sie dann WIEDER zu lesen, um das neu initialisierte Array zu füllen.

Gibt es eine Möglichkeit, die Daten dynamisch zu verteilen, wie sie benötigt werden?

Antwort

6

Sie können eine ArrayList verwenden, die Ihnen die dynamische Größe gibt, die Sie benötigen.

List<Float> vertices = new ArrayList<Float>(); 

Sie können einen Wert wie folgt hinzu:

vertices.add(5.0F); 

und die Liste wächst an Ihre Bedürfnisse anpassen.

Einige Dinge zu beachten: Die ArrayList enthält Objekte, keine primitiven Typen. Daher speichert es die Float-Werte, die Sie als Float-Objekte bereitstellen. Es ist jedoch leicht, den ursprünglichen Gleitkommawert von diesem zu erhalten.

Wenn Sie unbedingt ein Array benötigen, können Sie nach dem Einlesen der gesamten Werteliste ganz einfach ein Array aus der Liste abrufen.

Sie können über Java Collections here lesen.

0

Nein, Sie können nicht initialisierte Arrays nicht ausfüllen. Wenn Sie eine dynamische Struktur benötigen, die das Speichern von Daten + Indizes (die in Ihrem Fall wichtig zu sein scheinen) ermöglicht es, die ich für Karte gehen würde (Schlüssel der Karte wäre Ihr Index sein):

Map<Integer, Float> vertices = new HashMap<Integer, Float>(); 
vertices.put(95, 5.004f); 
1

In Java-Arrays vorher initialisiert werden. In Ihrem Fall haben Sie die folgenden Optionen:

1) Verwenden Sie eine ArrayList (oder eine andere Implementierung der List Schnittstelle), wie von anderen vorgeschlagen. Solche Listen können dynamisch wachsen, so dass dies hilfreich ist.

2) Wenn Sie die Kontrolle über das Dateiformat haben, fügen Sie am Anfang der Datei Informationen zur Anzahl der Scheitelpunkte hinzu, damit Sie Ihr Array mit der richtigen Größe vorinitialisieren können.

3) Wenn Sie keine Kontrolle darüber haben, versuchen Sie, die Anzahl der Scheitelpunkte basierend auf der Dateigröße zu schätzen (float ist 4 Bytes, also teilen Sie zB File.length() durch 4). Wenn die geschätzte Zahl zu klein ist, können Sie dynamisch ein größeres Array (z. B. 120% der vorherigen Array-Größe) erstellen, alle Daten vom vorherigen Array in das neue kopieren und weitermachen. Dies kann teuer sein, aber wenn Sie die Array-Größe genau schätzen, ist das kein Problem.

Wir könnten Ihnen vielleicht mehr Ideen geben, wenn Sie uns mehr Informationen über das Dateiformat geben und/oder wie diese Anordnung von Vertices verwendet wird (wie: lange gespeichert oder schnell weggeworfen).