2016-06-21 47 views
0

覆蓋我試圖編碼一個算法,可以通過他的經驗學習(在遊戲中連接四個)。爲此,我想將所有單個步驟保存在列表中。但是,如果我將元素添加到列表中,則列表中的每個元素都會被我添加的元素覆蓋。我不知道爲什麼這是這樣,甚至在搜索後我不知道爲什麼,因爲我的Runde.java中沒有靜態字段。該代碼是在這裏:(IM德國,所以不要通過怪異的名字來感到驚訝)Java ArrayList元素被上次添加元素

package me; 

public class Runde{ 

    private int[][] spielfeld; 
    private int[][] x= new int[7][5]; 
    private int lastx; 
    private int lasty; 
    public Runde(int[][] spielfeld1, int xi, int jetzgzuege, int y){ 
     spielfeld=spielfeld1; 

     lastx=xi; 
     x[xi][4]=jetzgzuege; 
     lasty=y; 
    } 
    public boolean equal(int[][] spielfeld){ 
     if(spielfeld.equals(spielfeld)){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 
    public void finishround(boolean sieg, int geszuege){ 
     x[lastx][0]+=1; 
     if(sieg){ 
      x[lastx][1]+=1; 
      x[lastx][2]+=geszuege; 
     }else{ 
      x[lastx][3]+=geszuege; 
     } 

    } 
    public int[][] getSpielfeld(){ 
     return spielfeld; 
    } 
    public int[][] getData(){ 
     return x; 
    } 
    public int getlastx(){ 
     return lastx; 
    } 
    public int getlasty(){ 
     return lasty; 
    } 
} 


static ArrayList<Runde> liste= new ArrayList<Runde>(); 
static ArrayList<Runde> Steps= new ArrayList<Runde>(); 


static void erzeugeGen(){ 
    int[][] spielfeld=leeresSperzeugen(); 
    int x=0; 
    int y=0; 
    int zug=0; 
    int rand = new Random().nextInt(2); 
    boolean player; 
    if(rand==1){ 
    player = true; 
    }else{ 
    player=false; 
    } 
    while(!winner(spielfeld,x,y) && zug<42){ 
     zug++; 
     player=!player; 
     Runde r; 
     if(player){ 
       r= Computerzug(spielfeld.clone(),1,zug); // If i have a look in to the spielfeld in this element, its fine 
       Steps.add(r); // But after adding like this, its overridden :(
     }else{ 
       r= Computerzug(spielfeld.clone(),2,zug); 
     } 
     x=r.getlastx(); 
     y=r.getlasty(); 
     if(player){ 
      spielfeld[y][x]=1; 
     }else{ 
      spielfeld[y][x]=2; 
     } 
    } 
    if(zug<42){ 
    GenAuswerten(zug,player); 
    zuege+=zug; 
    }else{ 
     gen--; 
    } 

} 

static void GenAuswerten(int zug, boolean win){ 
    for(Runde r: Steps){ 
     r.finishround(win, zug); 
     ArrayList<Runde> removal = new ArrayList<Runde>(); 
     for(Runde r2 : liste){ 
      if(r2.equal(r.getSpielfeld())){ 
       removal.add(r2); 
      } 
     } 
     for(Runde r3: removal){ 
      liste.remove(r3); 
     } 
    } 

    for(Runde r: Steps){ 
     liste.add(0,r); 
    } 
    Steps.clear(); 
} 
+0

一個多維數組不是'List'。 –

+0

代碼中沒有顯示ArrayList – FredK

+0

我無法在上面的代碼中找到Java ArrayList? ;-) –

回答

0

,您將需要克隆二級陣列,當你克隆此

R = Computerzug( spielfeld.clone(),1,祖格);

所以正確的代碼是

int spielfeldclone[][] = new int[spielfeld.length][]; 
int i = 0; 
for(int[] spielfeldArray: spielfeld){ 
     spielfeldclone[i] =spielfeldArray.clone()lone(); 
     i++; 
} 
r= Computerzug(spielfeldclone,1,zug); 

的原因是,你正在做的二維數組的淺表副本

和remeber二維數組是數組

normaly克隆數組( )的任何陣列將工作,如果該陣列是原始類型,如int

但這裏的數組,你cloni NG包含數組

意味着你會得到新的引用到相同的第二級陣列對象

所以

施皮爾費爾德[0] == spielfeld.clone()[0]

爲真

因爲兩個施皮爾費爾德[0]和spielfeld.clone()[0]指向同一對象

現在要解決,我們需要做一個單獨的內部數組的淺拷貝導致深拷貝

+0

謝謝,實際上工作:D –

+0

而我現在明白它:D它因爲二維數組不能被克隆只.clone() ,因爲他們有其他陣列。謝謝。 –

+0

如果您覺得此答案對您的問題的答案很好,請選中該複選框以將其作爲答案。謝謝 – Hani