2014-01-12 4 views
-2

Я сделал класс, содержащий arraylist. значения добавляются правильно. когда я пытаюсь получить значения, он всегда возвращает одно и то же значение.Почему ArrayList всегда возвращает такое же значение ..?

public class Data { 

    public ArrayList<Piece[][]> allMoves=new ArrayList<Piece[][]>(); 

    public Data() { 

    } 
} 

Другие части кода, чтобы добавить и получить доступ к его значения являются следующие

public void save_this_move() 
{ 
    Piece temp[][]=new Piece[8][8]; 

    for(int i=0;i<8;i++) 
    { 
     for(int j=0;j<8;j++) 
     { 
      temp[i][j]=board[i][j]; 
      //System.out.print(temp[i][j].get_name()+" "); 
     } 
     //System.out.println(); 
    } 
    allMoves.add(temp); 
    //System.out.println("................."); 
} 

и

public void undo() 
{ 
    for(int i=0;i<allMoves.size();i++) 
    { 
     Piece temp[][]=allMoves.get(i); 
     System.out.println(i+"th index"); 
     for(int j=0;j<8;j++) 
     { 
      for(int k=0;k<8;k++) 
      { 
       System.out.print(temp[j][k].get_name()+" "); 
      } 
      System.out.println(); 
     } 
    } 


} 

Пожалуйста, помогите мне, как это исправить ??

ответ

2

Вопрос заключается в том, что каждый элемент allMoves хранит ссылки на тот же набор из 64 Piece объектов

Это делает их изменить все сразу.

Вместо того, чтобы просто скопировать ссылку в

 temp[i][j]=board[i][j]; 

вы должны скопировать объект.

+0

Таким образом, переместить инициализацию кусок внутри цикла – keyser

+0

@MohammadS .: Это создает новый массив. Однако 'temp [i] [j] = board [i] [j]' просто копирует ссылки из одного массива в другой. – NPE

+0

метод save_this_move вызывается каждый следующий экземпляр. я не понял, как я могу его решить –

0

Mate, когда вы используете этот код,

allMoves.add(temp); 

это на самом деле имеет ссылку на темп.

Так что вам нужно сделать что-то вроде

allMoves.add(new String[][]{....); 

это один может не работать, но у вас есть точка ..

получайте удовольствие!

Ладно, ребята, добавить метод принимает только ссылку последнего объекта и дублирует его, но, позволяет дать пример для одного массива string.If вы пытаетесь добавить

String [] thing = new String[3]; 
thing = {bla, blabla, blablabla} 
allmoves.add(thing); 

это будет как {блаблабла, блаблабла, блаблабла}

Но если вы используете

allmoves.add(New String{bla, blabla, blablabla}); 

будет бла, BlaBla, блаблабла

Ты понял?

Ссылки и things.Since существует этот вид bug.Thats единственный способ сделать это ...

+0

Вопрос уже был дан, и ваш ответ не принес ничего нового. – NiematojakTomasz

+0

Хотя релевантность ответа @ kaan-Öztürk может быть сомнительной, на вопрос не ответил, так как ответа не было принято. – m4rtin

Смежные вопросы