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:
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!!!
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!!!