Array dynamisieren oder ArrayList verwenden?

saxopraxo

Mitglied
Hallo Leute.

Ich habe eine Frage zu einem Problem mit Array und ArrayList.
Das Array wird mit festen Grenzen definiert und die ArrayList ist eine Liste von Arrays.
Ich muss Daten auswerten und muss ich mit einem dynamischen Array arbeiten, weil ich die Grösse des Arrays am Anfang nicht weiss.
Dieses Array ist mehrdimenional und mit jedem gefundenen Wert und seinen Unterwerten (Index) soll das Array grösser werden.
In VBA gibt es eine Möglichkeit, ein Array zu vergrössern und zu verkleinern, je nachdem wie man es benötigt.
In JAVA habe ich diese Möglichkeit noch nicht gefunden. Wenn ich eine ArrayList benutze, dann ist ja jeder neue Index in einzelnes Array, das zur ArrayList addiert wird.
Ein „normales“ Array kann ich nachdem es definiert wurde, nicht mehr ändern.
Wie kann man da am besten vorgehen? Erst alles auszählen und dann das Array definieren?

Gruß

Saxopraxo
 
Eine ArrayList ist keine Liste von Arrays. Es ist eine Implementierung der Schnittstelle `java.util.List` mit Hilfe eines einzelnen Arrays, das intern entsprechend dynamisch vergrössert wird, wenn nötig.
Nichtsdestotrotz kannst du natürlich als Elementtyp einer ArrayListe wiederum Arrays haben, wenn du dynamisch mehrere Arrays in einer Liste speichern möchtest.
 
In VBA gibt es eine Möglichkeit, ein Array zu vergrössern und zu verkleinern, je nachdem wie man es benötigt.
In JAVA habe ich diese Möglichkeit noch nicht gefunden.
Direkt lässt sich ein Java-Array nicht vergrößern. Der übliche Weg besteht darin, ein neues, größeres Array anzulegen, die Daten aus dem alten Array in das neue Array zu kopieren und dann die Referenz auf das neue Array, der Variablen zuzuweisen, die die Referenz auf das alte Array enthält.
Java:
int[] arr = int[100]; // z.B. ein int-Array
// ...
int[] temp = int[200];
System.arraycopy(old, 0, temp, 0, old.length);
arr = temp;

Ich würde allerdings zur ArrayList tendieren, wenn nicht ganz spezielle Gründe dagegen sprechen.
 
Zuletzt bearbeitet:
Hallo,

danke für die schnelle Antwort.
So wie ich es verstehe:
ArrayList sind eine Liste von addierten Arrays.
Ich müsste dann für jeden neuen Index ein neues Array definieren und dann dazu addieren.
Die Arrays müssten dann über eine Variable hochgezählt werden beim definieren.

Gruss

Saxopraxo
 
Hier ist die "Anleitung" zur ArrayList

ArraList ist eine Implementation des Interfaces List

Java:
// erzeuge eine Liste für Strings
List<String> stringliste = new ArrayList<>();

// füge Daten hinzu
stringliste.add("Ein String");
stringliste.add("Hurra!");

// gib einen String wieder aus
System.out.println(stringliste.get(0)); // "Ein String"
 
Ich muss Daten auswerten und muss ich mit einem dynamischen Array arbeiten, weil ich die Grösse des Arrays am Anfang nicht weiss.
Dieses Array ist mehrdimenional und mit jedem gefundenen Wert und seinen Unterwerten (Index) soll das Array grösser werden.
Was soll das bedeuten? Hast du einen Wert, der eine Art Schlüssel darstellt und dazu mehrere Unterwerte?

Dann wäre vielleicht Map<> in Kombination mit List<> eine Lösung.

Java:
Map<String, List<String>> map = new HashMap<>();

Damit hast du jetzt zu einem Schlüssel (String) die Möglichkeit eine Liste von weiteren Strings zu speichern.

Du musst das natürlich auf deine gewünschten Datentypen anpassen.
 
Ehrlich gesagt habe ich noch nie darüber nachgedacht wie ArrayList implementiert ist - ich habe es immer wie ein dynamisches Array verwendet.
Es ist eine Liste, kein Array, jaja...aber das interessiert dich doch eigentlich nicht:

Java:
ArrayList<SomeClazz> list = new ArrayList<>();    //Eine neue Liste, nur ist sie leer

list.add(new SomeClazz());     //Füge ein Element ein...hast du bei der Initialisierung einen Platz dafür
                            //vorgesehen? Nicht? Ja gut daß es kein ordinäres Array ist...

list.add(new SomeClass());    //Ja, noch ein Element für das vorher kein Platz reserviert wurde...
 
Hallo Leute,

vielen Dank für die Hinweise und Tips. Das muss ich ausprobieren.
Meine Daten sind mehrdimensional, z.B. Name, Anhang, Wert 1, Wert 2.
Eigentlich müsste man Matrix dazu sagen.
z.B.:
0.0, 0.1, 0.2, 0.3, 0.4
1.0, 1.1, 1.2, 1.3, 1.4
2.0, 2.1, 2.2, 2.3, 2.4
...
n.0, n.1, n.2, n.3, n.4

Wobei ich am Anfang nicht weiss, wie gross "n" sein wird.
Deshalb auch die Idee mit der ArrayList.
Allerdings weiss ich nicht so recht, wie ich das am besten bewerkstelligen kann, zum anlegen, eintragen und wieder auslesen.

Gruss
 
Meine Daten sind mehrdimensional, z.B. Name, Anhang, Wert 1, Wert 2.
Das 2. Beispiel ist leider nicht ganz verständlich. Was ist am 2. Beispiel der Name?

Ist Name der Schlüsselwert (also der Spaltenkopf) und daran hängen dann der Anhang und Wert 1, 2, 3, n?

Oder ist es wie im zweiten Beispiel eine Tabelle mit 5 Spalten und n Zeilen?

Etwas konkreter müsstest du schon werden, damit man dir helfen kann.
 
Und ist es wirklich eine Matrix? Wenn du sagst, deine Daten sind mehrdimensional. Ist das nicht in Wirklichkeit ein eigenes Objekt mit einer eigenen Klasse?

Java:
public class Daten {
private String name;
private String anhang;
private int wert1;
private int wert2;
}
 
Meine Daten sind mehrdimensional, z.B. Name, Anhang, Wert 1, Wert 2.
Eigentlich müsste man Matrix dazu sagen.

Ja mei, da nehmste das:
Java:
ArrayList<ArrayList<Double>> matrixMasterlist = new ArrayList<>();

ArrayList<Double> newMatrixLine = new ArrayList<>();
for(Double d = 0.0; d < 0.5; d += 0.1){
    newMatrixLine.add(d);
}

matrixMasterlist.add(newMatrixLine);

//...

An deiner Stelle würde ich das in eine eigene Klasse kapseln, die auch darauf acht gibt daß z.B. alle Zeilen die gleiche Länge haben und nach außen hin Methoden wie addRow() oder addRows( int rowNum) (fügen jeder Zeile ein Element hinzu) oder setElement(int row, int column, double element) bereitstellen.

Oder, sicher noch cleverer: Es gibt garantiert schon jemanden, der Matritzen und Matrixoperationen bereits implementiert hat. Such dir eine entsprechende Bibliothek.

Edit:
Wenn du sagst daß man eigentlich von einer Matrix reden müßte, dann unterstelle ich daß es auch eine Matrix ist. Wenn es keine Matrix ist - naja, dann kannst du zumindest das Konstrukt einer ArrayList von ArrayListen verwenden.
 
Hallo,

der Gedanke mit der Matrix war falsch, das habe ich jetzt erkannt.
Eher mit dem Schlüsselwort ist der richtige Weg. "Name" wäre das Schlüsselwort und daran hängen dann die anderen Elemente.
Aber "LimDul" hatte die Idee mit dem Objekt. Wenn ich so darüber nachdenke, dann sind ja meine Elemente zusammen ein Objekt. Es sind ja immer die gleichen Elemente vorhanden und müssen zusammengefasst und ausgewertet werden.
Ich mache JAVA noch nicht so lange und auf diese Idee war ich garnicht gekommen.
Das müsste dann eine Liste von Objekten ergeben?

Gruss
 
@saxopraxo Beschreibe doch bitte mal dein Problem. NICHT deinen Lösungsansatz.

Das, was du jetzt schreibst, klingt mir viel (soweit ich es, im Kontext dessen was du bisher geschrieben hast, interpretieren kann) eher nach HashMap:
Java:
HasMap<String, ArrayList<Double>> masterMap = new HashMap<>();

ArrayList<Double> list = new ArrayList<>();
for(double d = 0; d < 0.5; d += 0.1){
    list.add(d);
}

masterMap.put("Irgendein Schlüsselwort für eine Gruppe von lauter Doubles", list);
 
Wenn ich so darüber nachdenke, dann sind ja meine Elemente zusammen ein Objekt.
Ja, es ist immer eine gute Idee, aus zusammengehörenden Dingen eine eigene Klasse (Objekt) zu machen!
(Eine Liste von Listen hat immer einen komischen "Geruch" (mit "Geruch" meine ich: https://en.wikipedia.org/wiki/Code_smell).)
Das müsste dann eine Liste von Objekten ergeben?
Du musst nicht unbedingt eine List benutzen. Es kann auch eine Map sein.
Dann kanst du zu einem Schlüsselwort (key) ein Objekt deiner neuen Klasse (value) speichern.
 
Zuletzt bearbeitet:
Hallo,

vielen Dank für die vielen Tips und Hinweise. Ihr habt mir sehr geholfen.
Ich werde jetzt mit dem "Objekt" arbeiten und erst mal selbst versuchen, das Programm zu erstellen.
Wenn ich dann wieder Probleme habe, dann melde ich mich wieder und frage bei Euch nach.

Gruss
 

Zurück
Oben