2016-06-21 45 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