Wie bekomme ich aus einer Zahlenreihe, einer Arrayreihe innerhalb einer arraylist?
Moin!
Ich bin ein blutiger Anfänger, bzw wieder, weil ich alles vergessen habe.
Ich würde gerne eine Zahlenreihe, innerhalb einer Arraylist (name "vorbereiten"), in Arraylisten innerhalb einer Arraylist machen (name "allelisten").
Kein schöner weg und wahrscheinlich auch sehr ungwöhnlich :)
Ich habe mit biegen und brechen und viel lesen irgendwie grob was hin bekommen, obwohl ich es auch ehrlich gesagt noch nicht ganz verstehe.
Mein Ziel ist es, das aus der Zahlenreihe die schon fest in einer Arraylist ist, 3er blöcke als Arraylist zu machen, die zudem nach größe sortiert werden sollen
Also aus [ 14, 44 ,21 , 77, 49, 1, 66, 9,....]
soll werden:
[ [14, 21 ,44] , [1,49, 77], [9, 66,....]]
Ich habe probiert mit ",remove" das irgendwie hin zu basteln, sodass die ersten 3 zahlen in "vorbereiten" verschwinden, aber ich bekomme das nicht in einen loop gebaut, sodass die Zahlen aber trotzdem in "allelisten" bestehen bleiben.
Zudem weiss ich nicht, was ich anstatt der "10" bei "i<10; i++" einfügen muss, damit die ganze liste einmal durchgenommen wird. Es sind über 1000 zahlen.
Ich wäre sehr froh, wenn mir da jemand helfen könnte.
Vielen dank und bleibt gesund!
package eds;
import java.io.FileNotFoundException;
import java.util.ArrayList;
public class nhnbjbgn {
public static void main(String[] args) throws FileNotFoundException {
ArrayList<Integer> vorbereiten = new ArrayList<>();
vorbereiten.add(14);
vorbereiten.add(44);
vorbereiten.add(21);
vorbereiten.add(77);
vorbereiten.add(49);
vorbereiten.add(1);
vorbereiten.add(66);
vorbereiten.add(9);
vorbereiten.add(99);
ArrayList<ArrayList<Integer>> alleListen = new ArrayList<>();
ArrayList<Integer> tmp;
for(int i=0;i<10;i++){
tmp=new ArrayList<>();
if(i==0){
tmp.add(vorbereiten.get(0));
tmp.add(vorbereiten.get(1));
tmp.add(vorbereiten.get(2));
}
else{
tmp=(ArrayList<Integer>) alleListen.get(i-1).clone();
}
alleListen.add(tmp);
}
System.out.print(vorbereiten);
System.out.print(alleListen);
}
}
2 Antworten
Wenn du in 3er Gruppen die Zahlenreihe organisieren lassen willst musst du auch 3er Sprünge machen, also war dein Ansatz nicht falsch nur ist darin ein logischer Fehler, weil dem Compiler schrurzegal ist welchen Blödsinn du anstellst.
Schau mal deine Schleife, ich kommentiere das mal:
for(int i=0;i<10;i++){ // müsstest du hier nicht eher i=i+3 einsetzen?
tmp=new ArrayList<>();
if(i==0){ // nur wenn i==0?
tmp.add(vorbereiten.get(0)); // immer das 0te Element? was ist mit i?
tmp.add(vorbereiten.get(1)); // i+1 uws.
tmp.add(vorbereiten.get(2));
}
else{
tmp=(ArrayList<Integer>) alleListen.get(i-1).clone(); // mir fehlen die Worte
}
alleListen.add(tmp); // ok, das könnte gehen
}
Du solltest objektorientiert denken, Arraylisten sind verschachtelbar aber Klassen bieten noch weitaus mehr.
Sorry, weil ich dir das nicht mit einem C++ Beispiel coden kann.
Das Prinzip für die Aufteilung sollte so sein:
Iteriere in Dreierschritten durch die Quellliste (zähle dabei den Index mit)
Lege neue Liste an
Füge Eintrag von Index ein
Füge Eintrag von Index + 1 (= Nachfolgeelement) ein
Füge Eintrag von Index + 2 (= Nachnachfolgeelement) ein
Füge neue Liste der Zielliste an
Dabei musst du beim Einfügen aufpassen. Da du nicht sicher sein kannst, dass die Länge der Quellliste teilbar durch drei ist, kannst du auch nicht fest davon ausgehen, dass im allerletzten Iterationsschritt noch ein Nachfolge-/Nachnachfolgeelement ermittelt werden kann. Nimm nur diese Liste einmal als Beispiel:
2, 0, 4, 1
Die Länge ist 4. Im ersten Iterationsschritt werden die Elemente an Index 0, 1 und 2 gezogen (2, 0 und 4). Im zweiten Iterationsschritt würde der Algorithmus die Indizes 3, 4 und 5 suchen und nur beim ersten nicht scheitern. Prüfe also erst anhand der Länge der Quellliste, ob es diese Indizes geben kann, bevor du versuchst, auf sie zuzugreifen.
Nun fehlt an sich nur noch die Sortierung der Elemente. Eine Einsortierung könnte beim Einfügen geschehen
Iteriere durch neue Liste
Wenn neues Element > aktuelles Element
Füge an Position nach aktuellem Element ein
oder erst im Anschluss, wenn alle Elemente schon eingefügt wurden. Hierbei könnte man eine Unterscheidung nach Länge der Liste vornehmen. Bei nur einem Element ist bspw. keine Sortierung nötig, bei zwei Elementen maximal ein Positionsaustausch. Bei drei Elementen könnte man den Lösungsweg für zwei Elemente ausbauen bzw. einen Sortieralgorithmus (wie Bubblesort, Insertionsort) einsetzen (die einzelnen Schritte evt. gar ausgerollt, also ohne Schleife).
Zudem weiss ich nicht, was ich anstatt der "10" bei "i<10; i++" einfügen muss, damit die ganze liste einmal durchgenommen wird.
In der API Referenz kannst du alle Methoden nachschlagen, die der ArrayList zur Verfügung stehen: ArrayList. Die size-Methode wäre für deinen Fall passend.
int length = vorbereiten.size();