从ArrayList元素复制数组

时间:2015-07-07 15:58:03

标签: java arrays arraylist

我正在Swing中构建一个基于Java的游戏,它本质上是一个Jbuttons网格

我有一个名为Cell的Object,它是一个自定义JButton,带有用于存储对象的附加参数。游戏网格由Cell[][]

表示

我有一个Cell[][]类型的arraylist,允许我在每次移动后存储gamegrid的状态。如果我要撤消移动,我需要将ArrayList的最后一个元素复制到游戏网格,以允许它显示在UI上。

我的游戏网格是panelHolder,我的arraylist是moveHolder

到目前为止,我已经尝试Collections.copy(panelHolder, moveHolder.get(moveHolder.size()));由于“参数不适用于类型Cell[][]”而无法编译

我也尝试了System.arraycopy(moveHolder.get(moveHolder.size()-1), 0, panelHolder, 0, panelHolder.length);,它抛出并超出界限异常。最初我认为这是由于moveHolder.size()-1,但即使只是moveHolder.size()它也有同样的问题。

我在StackOverflow和其他人身上发现了很多问题,他们都展示了这两种方法,但我似乎无法让它发挥作用。有什么比我更缺的了吗?全类方法如下:

 public class UndoClass implements MoveCommand{

    public ArrayList<Cell[][]> moveHolder = new ArrayList<Cell[][]>();

    public Cell[][] execute(Cell[][] panelHolder) {
        if (moveHolder.size() > 0){
            Collections.copy(panelHolder, moveHolder.get(moveHolder.size()));       
            if (moveHolder.size() > 0){
                moveHolder.remove(moveHolder.size());
            }
        }
        System.out.println("Move Undone. Undos available:" + moveHolder.size());
        return panelHolder;
    }
    public void addMove(Cell[][] panelHolder){
        moveHolder.add(panelHolder);
    }

    public ArrayList<Cell[][]> getMoves(){  
        return moveHolder;
    }
}

细胞分类

public class Cell extends JButton {

    int co_x = 0;
    int co_y = 0;


    ArrayList<Players> current = new ArrayList <Players>();

}

3 个答案:

答案 0 :(得分:1)

只是想指出我们的execute(...)方法接受Cell [] []作为参数和返回参数。这种方法将强制所有命令继续将输入参数数组复制到return语句数组。请注意,如果您不需要保持两者同步,并且只使用返回arg,则根本不必担心复制:

Cell[][] lastState = moveHolder.get(moveHolder.size()-1);
moveHolder.remove(moveHolder.size()-1);
return lastState;  // Not updating the panelHolder array, just returning

但是当然现在输入parm和return不同步。相反,您可能希望将该状态封装到单个对象中,以使您的生活更轻松。这样的事情(请注意,execute现在返回一个void):

public ArrayList<GameState> previousStates = new ArrayList<GameState>();

public void execute(GameState currentState) {
    if (previousStates .size() > 0) {
         GameState lastState = previousStates.get(previousStates.size()-1);
         currentState.restoreFrom(lastState);
         previousStates .remove(moveHolder.size()-1);
    }   
 }

祝你好运!

答案 1 :(得分:0)

if (moveHolder.size() > 0) {
    for (int i = 0; i < panelHolder.length; i++) {
        panelHolder[i] = moveHolder.get(moveHolder.size()-1)[i].clone();   
    }
    moveHolder.remove(moveHolder.size()-1);
}

试试这个。复制2D数组时,需要复制每个内部数组。

答案 2 :(得分:0)

尝试链接列表

    LinkedList<Cell[][]> ll = new LinkedList();
    ll.removeLast();
    panelHolder = ll.clone();