【问题标题】:Copying Array from ArrayList Element从 ArrayList 元素复制数组
【发布时间】:2015-07-07 15:58:03
【问题描述】:

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

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

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

我的游戏网格是panelHolder,我的数组列表是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>();

}

【问题讨论】:

  • 您能否也发布Cell 课程,以便我们更容易尝试解决方案?
  • 由于 panelHolder 和 moveHolder.get(n) 是数组, System.arraycopy 是要走的路。转储两个数组的长度以检查它们是否是您认为的。
  • @ChetanKinger 编辑添加Cell class
  • 这不能回答你的问题,但我个人建议在这里使用 LinkedList 而不是 ArrayList。
  • 我认为您的问题在于这是一个数组数组。这个答案有帮助吗? stackoverflow.com/q/1564832

标签: java arrays arraylist


【解决方案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

当然,现在输入参数和返回不同步了。相反,您可能希望将该状态封装到单个对象中以使您的生活更轻松。像这样的东西(注意现在执行返回一个 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);
    }   
 }

祝游戏好运!

【讨论】:

    【解决方案2】:
    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);
    }
    

    试试这个。复制二维数组时,需要对每个内部数组进行复制。

    【讨论】:

    • @celticminstrel 谢谢,我知道为什么,但我最容易打错字
    • 这可以复制!还没有完全解决我的问题(我现在添加状态的逻辑有问题),但这正是我需要的
    【解决方案3】:

    尝试链接列表

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多