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