# LinkedList<LinkedList<String>> nach ArrayList<ArrayList<String>> ?



## Hans_Maulwurf (29. Jun 2012)

Hallo 

ich arbeite grad mit Listen, genauer gesagt zweidimensionalen Listen. Die haben auch ziemlich viele Elemente. Zum Füllen der Listen (mittels .add) benutze ich LinkedList<LinkedList<String>>, da dies schneller sein soll als mit ArrayList.

Zum Abrufen/Editieren ist ja nun aber eine ArrayList schneller/besser, da die LinkedList bei .get alle vorherigen Elemente durchgehen muss, da sie nur die Nachbarelemente "kennt".

Deshalb würde ich gern beide Listentypen benutzen, um von beiden die Vorteile zu nutzen und Nachteile zu umgehen. Nur die Konvertierung steht mir im Weg 

Gibt es denn eigentlich noch eine andere Art, wie ich die Elemente einer Liste alle durchlaufen kann und gleichzeitig editieren kann?
Wenn ich

```
for (String item : ListeMitString> {
    if (item == "bla") {
        item = "blubb"
    }
}
```

benutze, funktioniert es ja nicht. Deshalb benutze ich zur Zeit eine "einfache" for-Schleife mit Zählvariable.

So viele Fragen, vielleicht hat ja jemand ein paar Tipps für mich 

mfg Hans


----------



## SlaterB (29. Jun 2012)

> da dies schneller sein soll als mit ArrayList.
allein deinen Forum-Post zu formulieren kostet mehr Zeit, als du vielleicht im Leben mit LinkedList statt ArrayList einsparst,
wenn überhaupt etwas zu sparen ist..,
willst du nicht lieber gleich komplett auf ArrayList setzen?

ansonsten new ArrayList(andere Liste), bei Verschachtelung musst du in der Tat per Schleife die einzelnen Elemente austauschen,
die inneren ArrayList statt LinkedList ganz analog zu deiner zweiten Frage mit dem String

zu jener ist einerseits deine for-i-Schleife korrekt, als Tipp kann man ansonsten nur vorschlagen,
nicht String bzw. sonst ein zu ersetzendes Objekt X direkt einzufügen, sondern einen Container,
ein Objekt Y welches X enthält, dann kann Y gleichbleiben, X in Y ausgetauscht werden

der Aufwand kann freilich beträchtlich sein,
StringBuilder wäre ein Container, der auch beim Zusammenbau hilft,
List<List<String>>, worum es eh schon geht, auch hierzu denkbar, falls die innere Liste immer nur einen String enthält,
gegebenenfalls noch ne Stufe weiter List<List<List<String>>>


----------



## Hans_Maulwurf (29. Jun 2012)

Hmm, dann hab ich das wohl überinterpretiert. Dann werd ich wohl alles auf ArrayList setzen.

Bleibt noch der Punkt 2 und deinem Tipp: den versteh ich nicht 
Am praktischsten wäre es eben, wenn ich mit der for-Schleife (also ohne Zählvariable) nur eine Referenz/einen Pointer auf das Element bekommen könnte und keine lokale Kopie.


----------



## SlaterB (29. Jun 2012)

> nur eine Referenz/einen Pointer auf das Element bekommen könnte und keine lokale Kopie. 

du bekommst schon das Originalobjekt, davon keine Kopie, um es der Wichtigkeit wegen nochmal zu betonen,

aber die Referenz ist eine eigenständige Variable, quasi eine Kopie der Referenz innerhalb der Liste, ja,
und dazu gibt es in Java keine Alternative, nein, weder bei Methodenaufrufen, noch bei Listendurchlauf, noch irgendwo

du hast keinen Zugriff auf die Referenz im internen Aufbau der Liste, darum geht es ja,
du musst schon set-Methoden usw. bemühen,

oder wie gesagt Indirektion selber bauen: 
lasse die lokale Referenz + unabhängig davon die Referenz intern in der Liste unverändert auf ein Objekt Y verweisen,
diesen Wrapper darfs du aber inhaltlich verändern, 
wenn dort ein neues X ersetzt wird, wirkt sich das auf die Liste genauso aus, denn die verlinkt ja auch auf Y


----------



## Marco13 (29. Jun 2012)

Das mit der Geschwindigkeit würde ich so pauschal nicht sagen... Je nachdem, welche Operationen man durchführt, kann da schon ein deutlicher Geschwindigkeitsunterschied sein. Dass man aus diesem Grund Listen in verschiedene Typen konvertiert ist... etwas suspekt (auch wenn in der Collections-API selbst noch VIEEEL schlimmere Dinge gemacht werden  ) und man sollte es vermeiden, wenn man nicht wirklich einen eindeutigen Bottleneck identifiziert hat, und die Konvertierung einen echten Vorteil bringt.

Dewegen: Was willst du modellieren? Was für Operationen wilslt du darauf ausführen? Was ist wirklich das langsame daran? (Ohne Spekulation ~"Ich habe mal gehört X sei langsamer als Y"  ). Der Struktur nach ("2D-Liste") klingt das, als könnte man da auch ganz andere Ansätze verwenden...


----------



## Hans_Maulwurf (29. Jun 2012)

Eigentlich will ich "nur" aus mehreren txt-Dateien eine Excel-Datei erstellen (Apache POI HSSF). Also habe ich für jedes Sheet dann eine 2d-Liste, also eine Matrix. In den einzelnen Zellen sind aber "Formatierungsschlüssel" eingebaut, z.B. "bla-<f003>" da muss "-<f003>" abgeschnitten werden und die Zelle/Zeile in der Farbe 3 eingefärbt werden. Deshalb muss ich über jede Zelle iterieren bzw. diese auslesen/prüfen und aber gleichzeitig verändern können.

Also eigentlich keine große Algorithmenzauberei, jedoch können es ganz schön viele Daten werden, aber eben nur Strings. Die xls-Dateien am Ende sind zwischen 10 und 20 MB groß.


----------



## Marco13 (29. Jun 2012)

Sowas wie

```
interface Sheet {
    int getNumRows();
    int getNumColumns();
    void set(int r, int c, String value);
    String get(int r, int c);
}
```
könnte man in betracht ziehen... Das kann man implementieren, wie man will ... anhand der bisherigen Beschreibung würde da auch nichts gegen einen 2D-Array sprechen :bahnhof:


----------



## Hans_Maulwurf (30. Jun 2012)

Naja die ArrayList nutze ich, da ich vorher nicht weiß, wieviele Zeilen die txt hat. Gibt es denn zwischen ArrayList und Array überhaupt nennenswerte Unterschiede, da hinter der ArrayList ja doch auch nur ein Array steckt?


----------



## SlaterB (30. Jun 2012)

bis auf die Anzahl kaum etwas


----------



## bygones (2. Jul 2012)

SlaterB hat gesagt.:


> bis auf die Anzahl kaum etwas


von Useabilitysicht gesehen erspart man sich mit der ArrayList dazu noch das manuelle handling eines Arrays und das es das List interface implementiert und damit alle Nettigkeiten mitbringt.

aber ja von der logik unterscheiden sie sich nicht


----------

