Bestimmte Werte von Objekten aus einer ArrayList in eine andere ArrayList kopieren

DeDon

Mitglied
Hey Leute,

ich sitze jetzt seit mehreren Stunden an einem Problem, welches ich nicht gelöst kriege. Ich habe auch bereits ein KSKB (Kurzes, Selbständiges, Kompilierbares Beispiel) erstellt, in dem es aber auf einmal funktioniert.
Gut, dachte ich mir, dann machst du es genau so wie im KSKB, aber es funktioniert trotzdem nicht und ich komme einfach nicht dahinter warum.

Nun zeige ich euch erstmal den entsprechenden Code:
Zuerst das KSKB:

Java:
package arrayList;

import java.util.ArrayList;

public class arrayListProgramm {
	

	public static void main(String[] args) {

		//Vorbereitung
		ArrayList<Integer> arrayList = new ArrayList<Integer>();

		for (int i = 0; i <= 100; i++)
			arrayList.add(i);

		System.out.print("Erste Ausgabe: ");
		for (int i = 0; i < arrayList.size(); i++)
			System.out.print(+arrayList.get(i) + ", ");
		System.out.println(arrayList.get(arrayList.size() - 1));

		
		
		//Ab hier ist es genauso wie im Projekt wo es nicht funktioniert
		ArrayList<Integer> newArrayList = new ArrayList<Integer>();
		
		for (int i = 0; i < 24; i++) {
			newArrayList.add(arrayList.get(arrayList.size() - (24 - i)));
		}

		System.out.print("Zweite Ausgabe: ");
		for (int i = 0; i < newArrayList.size(); i++) {
			System.out.print(newArrayList.get(newArrayList.size() - (24 - i))
					+ ", ");
		}
	}
}

Dieser Code tut auch, was er tun soll: Er erzeugt eine ArrayList mit 100 Werten, aus dieser er dann die letzten 24 in der gleichen Reihenfolge in eine andere ArrayList kopiert.
So weit so gut.

Nun zu meinem Fall: Erst wieder der Code:

Java:
                ArrayList<Integer> typeExtensionPreviousTiles = new ArrayList<Integer>();

		
		//Anmerkung: dim.height / Tile.HEIGHT entspricht 24
		for (int i = 0; i < (dim.height / Tile.HEIGHT); i++) {
			typeExtensionPreviousTiles.add(tileArray.get(tileArray.size() - dim.height / Tile.HEIGHT - i).getTypeExtension());
//			System.out.println(tileArray.size());
//			System.out.print(typeExtensionPreviousTiles
//					.get(typeExtensionPreviousTiles.size() - 1) + ", ");
		}
		
		for (int i = 0; i < typeExtensionPreviousTiles.size(); i++) {
			System.out.print(typeExtensionPreviousTiles.get(typeExtensionPreviousTiles.size() - (24 - i)) + ", ");
		}
		
		System.out.println();


In diesem Fall erhält die eine ArrayListe Objekte(Tile), von denen ich einen ganz bestimmten Wert (typeExtension) der letzten 24 Objekte in eine andere ArrayListe "kopieren" möchte.
Ich habe schon alles mögliche hin und her gestellt, jetzt sollte der Code mit dem Code aus dem Beispiel beinahe identisch sein.

Ich hoffe sehr, dass mir jemand von euch helfen kann und bin für jedwede Hilfe sehr dankbar! 🙂


Lg,
DeDon


PS: Der zweite Code lässt sich leider nicht einfach kopieren und ausführen, denn dafür müsste ich über 550 zeilen Code, welcher in 3 Klassen aufgeteilt ist, kopieren und hier einfügen. Falls es sich aber nicht anders lösen lässt, kann ich diesen auch jmd schicken.
 
Ich versuche das mal zu implementieren. Danke für den Tipp/Hinweis. 🙂
Werde rückmelden ob ich es geschafft habe und ob es funktioniert.

Mich würde trotzdem interessieren warum mein alter Code nicht funktioniert (hat), falls jemand etwas dazu weiß oder jmd ein Fehler auffällt, fänd ichs super wenn er es mir mitteilt 🙂

Kann sein dass ich das mit der Implementierung/Rückmeldung heute nicht mehr schaffe, da ich noch was andres zu erledigen habe. Das hatte ich die ganze Zeit aufgeschoben weil ich so in den Code vertieft war. 😀
 
Lieber DeDon,

lass mich raten: statt der letzten 24 Elemente in ursprünglicher Reihenfolge bekommst du die 48- bis 24-letzten, und das in umgekehrter Reihenfolge?

Liegt vmtl. daran, dass

size() - (24 - i)

ungleich

size() - 24 - i

ist. Mathematik Klasse 3 (oder 4), Ausmultiplizieren einer Klammer, hier mit (-1)...
 
Lieber arilou,

was soll ich aus dieser spöttischen Bemerkung groß gelernt haben, abgesehen davon, dass meine Lösung wohl falsch ist und du es wohl besser weißt? Einen wirklichen Lösungsvorschlag oder dass du mir meinen Fehler erklärst, konnte ich nicht erkennen.
Wie ich ja geschrieben habe, saß ich schon mehrere Stunden dran. Da sinkt die Konzentation mit der Zeit. Ich hatte schon 100x alles mögliche umgestellt und da hab ich beim letzten verzweifelten zurück stellen ne Klammer vergessen.
Mich darauf hinzuweisen, völlig in Ordnung, kann man aber auch anders machen.


Nun ja, die Lösung kam mir am nächsten Morgen unter der Dusche 😀
Mit den Methoden war alles in Ordnung (In dem Code den ich gepostet habe natürlich nicht, aber das war schnell korrigiert).
Das Problem war ein logischer Denkfehler.

Ich werde meinen Fehler jetzt mal erklären, für den Fall, dass einem anderen Anfänger mal das gleiche passiert 🙂


Folgendes:
Ich habe eine ArrayList sagen wir mal mit Objekten mit den Werten 1 bis 30.
Auf dem Bildschirm werden dann die Objekte mit folgenden Werten so angezeigt:

1, 2, 3,
4, 5, 6,
7, 8, 9,
10, 11, 12,
13, 14, 15,
16, 17, 18,
19, 20, 21,
22, 23, 24,
25, 26, 27,
28, 29, 30

Jetzt sollte meine Methode folgendes machen:
Die Werte der Objekte in der letzten Reihe (also 3, 6, 9, 12 etc..) kopieren und neue Objekte mit den gleichen Werten in die ArrayList einfügen. Wenn jedes Objekt einen eigenen Wert hat, fällt natürlich schnell auf, dass einfach die letzten 10 zu entnehmen nicht zielführend ist. In meinem Fall haben aber viele Objekte den gleichen Wert und es kam einfach nicht raus, was ich erwartet hatte. Warum wird so ja klar.
Das war Denkfehler Nr 1. Man muss immer den Wert des 3ten Objektes entnehmen.

Dann habe ich mir die jeweils 3ten ausgeben lassen und beim zweiten Durchlauf (Es sollen unendlich Durchläufe folgen) habe ich mir die jeweils 4ten, dann die jeweils 5ten ect ausgeben lassen und mich wieder gewundert warum es denn wieder nicht klappt. Wenn man sich das jetzt aber noch mal als Zahlen verdeutlicht, fällt der Fehler schnell auf:

Die 2D-Darstellung sieht dann folgendermaßen aus:

01, 02, 03, 03,
04, 05, 06, 06,
07,0 8, 09, 09,
10, 11, 12, 12,
13, 14, 15, 15,
16, 17, 18, 18,
19, 20, 21, 21,
22, 23, 24, 24,
25, 26, 27, 27,
28, 29, 30, 30

Wichtig: Das 4te Objekt von links nach rechts gesehen (in der 2D Darstellung) ist nicht an der 4ten Stelle im Array, sondern an der 31ten.
Heißt: Wenn ich mir wieder jeweils den 4ten (im Array!) ausgeben lasse, bekomme ich nicht wieder die letzte Spalte. Diesmal muss man sich tatsächlich die letzten 10 ausgeben lassen.

(Falls sich jetzt jemand fragt, warum die ersten in so einer komischen Reihenfolge im Array liegen: Die Werte wurden aus einer Textdatei ausgelesen, welche Zeichen für Zeichen, Spalte für Spalte ausgewertet wird. In meinem Fall sind es auch nicht nur 30 Werte, sondern viel mehr.)

Ich habe das ganze jetzt in einem Stück geschrieben und hoffe es ist einigermaßen verständlich geworden 😳


Falls iwas unverständlich ist, kann ichs gerne nochmal überarbeiten 🙂
Und falls jemand sich tatsächlich in einer ähnlichen Situation befindet und trotzdem nicht auf des Rätsels Lösung kommt, kann er gerne nochmal rückfragen.


Zu guter Letzt (habe ja nen halben Roman geschrieben 😀) schildere ich nochmal kurz was das ganze soll:
Mein Programm ist ein Spiel, dessen Level aus Quadraten (Oha, das ist sogar Mathe 5te bis 6te Klasse?) besteht, welche jeweils einen eigenen Platz haben, welcher sich verändert, aber jedes Quadrat verändert seine Position gleich, d.h. das Muster bleibt immer bestehen. So.

Jedes dieser Quadrate hat einen bestimmten Typ, also quasi eine Typ-ID.
Die Typ-IDs sind auch das, was in der Textdatei eingelesen wird.
Jetzt sollten an die letzte Spalte immer Quadrate mit der gleichen Typ-ID angehangen werden, sodass das Level genauso weiter geht wie in der letzten Spalte.

Hintergund: Ich programmiere einen Endlos-Modus, in dem das Level zufällig generiert wird, aber so, dass es auf der jeweils letzten Zeile aufbaut, sonst kommt der Spieler ja irgendwann nicht mehr durch die Quadrate weil kein weg entsteht. Achja, die Quadrate sind Hindernisse, welche der Spieler nicht berühren darf.

Das ganze dient eigentlich nur als Übung für mich, aber ich hab da jetzt schon so viel Zeit investiert, dass ich das Projekt richtig ins Herz geschlossen habe. Laune macht es mir und meinen Freunden auch schon! 😀


Naja, genug Smalltalk, der Post ist schon lang genug. Schade, dass es keine Spoiler gibt :/ Oder ich hab se einfach nicht gefunden.


Dann hoffe ich mal dass die doch etwas komplizierte Erklärung mal einem anderen Anfänger was nützt,

Lg,
DeDon
 
Gut, das Thema des Threads passt jetzt nicht mehr ganz zu dem, was eigentlich das Problem war. Wenn jemand dafür einen passenderen Titel hat, nur her damit 🙂

Denn wie ihr vielleicht gemerkt habt, fällt mir das mich kurz fassen etwas schwer 😛
 
Vergleich' mal deine ursprüngliche Problembeschreibung mit deiner jetzigen.

Aus der ursprünglichen war mitnichten irgendwo ersichtlich, dass "jedes 3. Element" entnommen werden sollte, sondern "die 24 letzten". Und auch keine Sprache davon (und nirgends im Code zu sehen), dass die Elemente dann derselben Liste wieder hinzugefügt werden sollten. Du schriebst "das funktioniert im KSKB (Kurzes, Selbständiges, Kompilierbares Beispiel)", "es funktioniert trotzdem nicht [im richtigen Code]" - und das lag daran, dass dort nicht
Code:
-(24-i)
sondern
Code:
-24-i
stand.

"Einen wirklichen Lösungsvorschlag oder dass du mir meinen Fehler erklärst, konnte ich nicht erkennen."
Lösungsvorschlag: ändere -24-i entweder zu -24+i oder zu -(24-i)
Fehler-Erklärung: falsch ausmultipliziert

Das mit "Mathe Klasse 3" war spöttisch, ja, sorry.
Den Vorwurf, keinen Lösungsvorschlag und keine Erklärung erbracht zu haben, solltest du nochmal überdenken; für das von dir beschriebene Problem war meine Antwort imo ausführlich genug.
 
Zuletzt bearbeitet:
Vergleich' mal deine ursprüngliche Problembeschreibung mit deiner jetzigen.

Aus der ursprünglichen war mitnichten irgendwo ersichtlich, dass "jedes 3. Element" entnommen werden sollte, sondern "die 24 letzten".

Da hast du natürlich Recht. Dass jeweils das 3te entnommen werden soll(muss), war mir zu dem Zeitpunkt noch nicht klar.


Und auch keine Sprache davon (und nirgends im Code zu sehen), dass die Elemente dann derselben Liste wieder hinzugefügt werden sollten.

Stimmt ebenfalls. Ich bin darauf gar nicht eingegangen, weil ich dachte, dass es nur daran hakt, dass die Elemente nicht korrekt kopiert werden.


"Einen wirklichen Lösungsvorschlag oder dass du mir meinen Fehler erklärst, konnte ich nicht erkennen."
Lösungsvorschlag: ändere -24-i entweder zu -24+i oder zu -(24-i)
Fehler-Erklärung: falsch ausmultipliziert

Das mit "Mathe Klasse 3" war spöttisch, ja, sorry.
Den Vorwurf, keinen Lösungsvorschlag und keine Erklärung erbracht zu haben, solltest du nochmal überdenken; für das von dir beschriebene Problem war meine Antwort imo ausführlich genug.

Ich war nur sauer über die spöttische Bemerkung, letzten Endes konnte man daraus einen Lösungsvorschlag erkennen, das stimmt, wobei dass gar nicht mein eigentliches Problem war, aber da kannst ja nichts dafür, dass ich einen fehlerhaften Code gepostet hatte.


Aber da du dich entschuldigt hast, nehme ich die Entschuldigung an, man ist ja nicht nachtragend.
Dein Lösungsvorschlag war soweit ja auch richtig, hatte ich auch am nächsten Tag wd korrigiert und war wieder beim alten Problem.


Okay, hoffe der kleine Streit ist damit geklärt 🙂
 
Ja, genau das meinte ich, danke 😀
Habe dafür keinen Button gefunden, aber gut zu wissen.

Werde den Post dann nochmal eben überarbeiten, dass es wenigstens etwas übersichtlicher wird und nicht jeder der die Posts danach lesen möchte gefühlte 10 Mausradumdrehungen runter scrollen muss 😀

Wie hast du es eig geschafft, dass er das nicht auch zu einem Spoiler gemacht hat? Oder gibt es keinen Spoiler im Spoiler? :reflect:
 
@Gucky: Vielleicht solltest du deinen Nachrichtenordner mal leeren, ich bekam diese nette Meldung:
"Die folgenden Fehler traten bei der Verarbeitung auf

Der Posteingang von Gucky ist voll. Gucky kann keine weiteren Privaten Nachrichten empfangen, solange ältere Private Nachrichten nicht gelöscht worden sind."
😀


Jetzt muss ich den Thread wohl oder übel doch zuspamen 😛
Das hier wollte ich dir schreiben:

"Hey,

wollte nicht den Thread mit offtopic zuspamen, deswegen frage ich dich privat:

Kann man alte Beiträge nicht mehr editieren? Bei dem, welchen ich vor ein paar Minuten geschrieben habe, geht das, bei dem von gestern (oder vorgestern?) nicht.

Und ich dachte erst, ich würde mal wieder nen Button nicht finden 😀
(Falls es doch einen Spoiler-Button gibt)


Lg,
DeDon"

Da der Thread jetzt doch noch mehr zugemüllt wurde, 😛feif:
kanns mir natürlich auch gerne jemand anderes beantworten 🙂
 
😀 Jetzt müsste es hinhauen. Ich bin es noch gewohnt, wo ich einen Posteingang für 500 Mails hatte. Das waren noch Zeiten...

Doch das geht. Aber nur bis zu einer bestimmten Zeit nach dem Posten und wenn noch niemand darauf geantwortet hat (aber auch dann aber nur noch sehr kurze Zeit). Die Regeln sind ein bisschen verworren 😀
 

Zurück
Oben