ArrayList - remove() löscht nicht! - weiß nicht wieso!

Melli

Mitglied
Hallo,

ich habe leider ein Problem auf dessen Lösung ich auch nach mehreren Tagen nicht gekommen bin!
Ich poste euch erstmal meinen (leider etwas umfangreichen) Code:

Java:
import java.util.*;


public class Rateversuch {
	
	private int[] kombi = new int[4];
	public ArrayList<Rateversuch>	kombiList	= new ArrayList<Rateversuch> ();
	public ArrayList<Rateversuch>	infoMatrix	= new ArrayList<Rateversuch> ();
	public ArrayList<Integer>		toErase		= new ArrayList<Integer> ();
	
/*
 	* Standardkonstruktor
 * wird zur Erzeugung der infoMatrix benutzt
 * 
 */
	public Rateversuch() {
		for (int i=0; i<4; i++)
			this.kombi[i] = 0;
	}
	
	/*
	 * Konstruktor mit einem int-Parameter
	 * dient der Initialsierung der kombiList-Elemente
	 * 
	 */
	public Rateversuch(int i) {
		int tmp3 = i % 10;
		int tmp2 = (i/10) % 10;
		int tmp1 = (i/100) % 10;
		int tmp0 = (i/1000) % 10;
		
		if (i<10) {
			this.kombi[3] = i;
		} else {
			this.kombi[3] = tmp3;
			this.kombi[2] = tmp2;
			if ((i>=100 && i<1000) || (i>=1000 && i <10000)) {
				this.kombi[1] = tmp1;
			}
			if (i>=1000 && i <10000) {
				this.kombi[0] = tmp0;
			}
		}
	}

	/*
	 * updateMatrix(ArrayList<Rateversuch> list)
	 * zunächst wird überprüft ob in der ArrayList "infoMatrix" positionsbekannte
	 * blackHits hinterlegt sind. ist dies der Fall werden alle anderen Digits für
	 * diese Spalte ausgeschlossen indem deren Zustand auf 0 gesetzt wird.
	 * 
	 * dann wird die zu Beginn komplette ArrayList "kombiList" anhand der "infoMatrix"
	 * auf auszuschließende Rateversuche/Kombinationen (Zustand 0) hin durchlaufen:
	 * die Indices der zu löschenden Kombinationen wird in der ArrayList "toErase"
	 * gespeichert - nach Abschluß der Schleifendurchläufe wird die Funktion
	 * "eraseKombis()" aufgerufen welche besagtte Kombinationen löscht.
	 *  
	 */
	public ArrayList<Rateversuch> updateMatrix(int blackHits, int whiteHits) {
		for(int im=0; im<infoMatrix.size(); im++){
			for(int imE=0; imE<infoMatrix.get(im).getKombi().length; imE++) {
				if (this.infoMatrix.get(im).getKombi()[imE] == 1) {
					for(int im2=0; im2<10; im2++) {
						this.infoMatrix.get(im2).getKombi()[imE] = 0;
					}
					this.infoMatrix.get(im).getKombi()[imE] = 1;
				}
				for(int kl=0; kl<kombiList.size(); kl++) {
					for(int klE=0; klE<kombiList.get(kl).getKombi().length; klE++) {
						if(	(this.infoMatrix.get(im).getKombi()[imE] == 0) &&
							(this.kombiList.get(kl).getKombi()[klE] == im) &&
							(imE == klE) ) {
							toErase.add(kl);
						}
					}
				}
			}
		}
		

		int[] columCount = new int[4];
		int[] toBlack = new int[] {11, 11, 11, 11};
		for(int imE=0; imE<4; imE++) {
			columCount[imE] = 1;
			for(int im=0; im<10; im++){
				if (this.infoMatrix.get(im).getKombi()[imE] == 0) {
					columCount[imE]++;
				}
				if (this.infoMatrix.get(im).getKombi()[imE] == 2) {
					toBlack[imE] = im;
				}
			}
		}
		
		for (int i=0; i<4; i++){
			for(int j=0; j<10; j++){
				if(columCount[i] == 10 && toBlack[i] == j) {
					this.infoMatrix.get(j).getKombi()[i] = 1;
				}
			}
		}
		this.eraseKombis();
		return this.kombiList;
	}

	/*
	 * earaseKombis
	 * hier werden anhand der ArrayList "toErase" alle nicht mehr
	 * in Frage kommenden Kombinationen aus "kombiList" entfernt.
	 * um die doppelt eingetragenen ArrayList-Indecies zu entfernen
	 * wird die ArrayList "toErase" zunächst temporär einem HashSet
	 * zugewiesen, um sofort darauf nachdem das HashSet automatisch
	 * alle Duplikate entfernt hat, die übrigen Elemente wieder in
	 * eine ArrayList zu kopieren, mit der wir weiter arbeiten können.
	 * 
	 */
	private ArrayList<Rateversuch> eraseKombis() {
		HashSet<Integer> hs = new HashSet<Integer>();
		hs.addAll(this.toErase);
		ArrayList<Integer> cleanToEarase = new ArrayList<Integer>();
		cleanToEarase.addAll(hs);
		System.out.println("Anzahl der zu löschenden Kombinationen: "+cleanToEarase.size());
		
		for (int i=0; i<cleanToEarase.size(); i++) {
			try{
				this.kombiList.remove(cleanToEarase.get(i));
					
			} catch (Exception e) {
				System.out.println(e);
			}	
		}
		return this.kombiList;
	}

	/*
	 * build100000
	 * Initialisierung von "kombiList" über den Konstruktor "Rateversuch(int i)"
	 */
	public void build10000() {
		for (int i=0; i<10000; i++){
			this.kombiList.add(new Rateversuch (i));
		}
	}
	
	/* 
	 * buildInfoMatrix
	 * diese Methode dient dazu die ArrayList infoMatrix zu initialisieren.
	 * dazu wird in einer for-Schleife 10x der default-Konstruktor aufgerufen
	 */
	public void buildInfoMatrix() {
		for (int i=0; i<10; i++){
			this.infoMatrix.add(new Rateversuch());
		}
		this.infoMatrix.get(9).getKombi()[0] = 1;	// diese Änderungen stehen hier nur temporär hard gecoded!
		this.infoMatrix.get(9).getKombi()[1] = 1;	// später werden die Ergebnisse der Rateversuche analysiert
		this.infoMatrix.get(9).getKombi()[2] = 1;	// und die Zustandwerte der Matrix dynamisch angepasst..
		this.infoMatrix.get(9).getKombi()[3] = 0;
		this.infoMatrix.get(0).getKombi()[3] = 0;
		this.infoMatrix.get(1).getKombi()[3] = 2;
		this.infoMatrix.get(2).getKombi()[3] = 0;
		this.infoMatrix.get(3).getKombi()[3] = 0;
		this.infoMatrix.get(4).getKombi()[3] = 0;
		this.infoMatrix.get(5).getKombi()[3] = 0;
		this.infoMatrix.get(6).getKombi()[3] = 0;
		this.infoMatrix.get(7).getKombi()[3] = 0;
		this.infoMatrix.get(8).getKombi()[3] = 0;
	}
	
	/*
	 * getKombi
	 * getter-Methode für das kombi-Attribut
	 */
	public int[] getKombi() {	 
		return this.kombi;
	}
	
	
	public static void main(String[] args) {
	
		Rateversuch rv = new Rateversuch();
		rv.build10000();
		rv.buildInfoMatrix();
		
						for(int im=0; im<10; im++){
							for(int imE=0; imE<4; imE++){
								System.out.print(""+rv.infoMatrix.get(im).getKombi()[imE] +"\t");
							}
							System.out.print("\n");
						}
		
		rv.kombiList = rv.updateMatrix(0, 0);
		
						for(int im=0; im<10; im++){
							for(int imE=0; imE<4; imE++){
								System.out.print(""+rv.infoMatrix.get(im).getKombi()[imE] +"\t");
							}
							System.out.print("\n");
						}

	
		System.out.println("Kombis nach der Löschung: "+rv.kombiList.size());
		// es gibt immer noch 10.000 Kombinationen - obwohl 9.999 hätten gelöscht werden sollten... ?!?
						
		// zBsp die kombiList.get(3298), obwohl diese eigentlich in Zeile 127 mit der remove() geläscht sein müsste... :(
		System.out.println(""+rv.kombiList.get(3298).getKombi()[0]+rv.kombiList.get(3298).getKombi()[1]+rv.kombiList.get(3298).getKombi()[2]+rv.kombiList.get(3298).getKombi()[3]);
	}
	
}


In Zeile 102 rufe ich innerhalb der Methode updateMatrix() die Methode earaseKombis() auf: in earaseKombis() sollen Elemente aus dem Array "kombiList" entfernt werden, und zwar die, deren Indicies vor dem Methodenaufruf in der updateMatrix-Methode in die ArrayList "toErase" (Zeile 73) geschrieben wurde. dies funktioniert soweit auch alles richtig, wie man über sysout ferstellen kann .

Aber in eraseKombis() (in Zeile 126) funktioniert der Aufruf
this.kombiList.remove(cleanToEarase.get(i));
scheinbar nicht. wenn jemand mir einen Tipp geben könnte was das Problem ist oder sein könnte wäre das superhilfreich! Lieben Dank im vorraus!!! 🙂
 
Danke!, erstmal.. 🙂

@Volvagia
wenn ich den von dir vorgeschlagenen Cast benutze werden tatsächlich Elemente gelöscht, aber leider nicht alle: es werden dabei dann sehr viele Exceptions ausgeworfen...

@xehpuk
die rückwärts sortierte ArrayList allein reicht leider auch noch nicht aus. ich habe so etwas ähnliches auch versucht indem ich die for-Schleife aus Zeile 124 dekrement durchlaufen habe. hat auch nichts geholfen.

Java:
Collections.reverse(cleanToErase);

		for (int i=cleanToErase.size(); i>-1; i--) {
			try{
				this.kombiList.remove(((int)(cleanToErase.get(i))));
//				this.kombiList.remove(cleanToErase.get(i));	
			} catch (Exception e) {
				System.out.println(e);
			}	
		}

weitere Vorschläge, irgendwer?! 🙂
 
Du bekommst die Zahlen aus einen HashSet. Das ist von Natur aus unsortiert. Mit Collections.reverse(cleanToErase); verdrehst du die Liste, also index 0 -> index n - 1, index 1 -> index n - 2 usw.
Du kannst Collections.sort(list) verwenden und rückwärts durchlaufen oder du sortierst gleich rückwärts indem du einen Comparator übergibst. (Ich persönlich bevorzuge ersteres.)
 
:applaus: Hallo ihr Zwei! :applaus:
Vielen Dank! Eure beiden ursprünglichen Hinweise zusammen genommen sind genau die Lösung meines Problems. Vor allem Dank der netten und hilfreichen Erklärungen von Volvagia kann man als Anfänger die Tipps dann auch verstehen und besser einORDNEN! 😉

Java:
Collections.sort(cleanToErase);
		
		for (int i=cleanToErase.size(); i>-1; i--) {
			try{
				this.kombiList.remove(((int)(cleanToErase.get(i))));
			} catch (Exception e) {
				System.out.println(e);
			}	
		}
 

Zurück
Oben