【问题标题】:How to get every number in an ArrayList into a variable如何将 ArrayList 中的每个数字转换为变量
【发布时间】:2014-11-27 23:01:13
【问题描述】:

所以,我正在创建一个游戏,当用户的玩家点击一个位置(有很多)时,我希望它结束​​游戏。

我有两个这样的ArrayLists

ArrayList<Integer> ex = new ArrayList<Integer>(), ey = new ArrayList<Integer>();

并且“坏”方块(如果用户击中它就会死亡)在他们通电后出现,因此经常添加Integers

我正在尝试使用for loop 循环遍历大小(如下所示),但这不起作用,因为i 显然只选择最新的。

for(int i = 0; i < ex.size() - 1; i++) {
            if(x.get(0)==ex.get(i) && y.get(0) == ey.get(i)){
                gameover = true;
            }
        }

如果我像这样遍历整个arrayList

(int i : ex)

然后它在开始游戏时给我这个(下)错误:

Exception in thread "Animation Thread" java.lang.IndexOutOfBoundsException: Index: 10, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at snakegame.SnakeGame.draw(SnakeGame.java:113)
at processing.core.PApplet.handleDraw(PApplet.java:2386)
at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:240)
at processing.core.PApplet.run(PApplet.java:2256)
at java.lang.Thread.run(Thread.java:745)

那么,有没有办法将 ArrayList 的所有数字存储在一个变量中?

【问题讨论】:

  • 您在循环遍历数组列表之前是否测试了它的大小?如果您收到 IndexOutOfBoundsException,则该列表可能为空。试试 System.out.print(ex.size()) ;在 for 循环之前。
  • 您应该提供更多详细信息。什么是x,什么是yexey 存储什么? `for (Object o : ArrayList) 是使用迭代器循环遍历 ArrayList 的正确方法。
  • @DavidJones, x & y 存储角色位置,ex 和 ey 存储敌方位置
  • 我强烈建议将 x,y 坐标封装在单个类中,例如 Coordinate(x,y) 或使用现有的 Point,而不是存储两个可能彼此不同步的 ArrayList班级。然后你可以有一个ArrayList&lt;Coordinate&gt;。此外,当循环 i &lt; x.size()-1 时会错过列表中的最后一项(以防万一)
  • 啊,是的,这是真的,我很快就会这样做,谢谢!我没有应有的井井有条!

标签: java arrays list arraylist processing


【解决方案1】:

您对“enhanced for”的语义感到困惑

for(int i = 0; i < ex.size() - 1; i++) {

将值 012... 输入到 i 中,直到 ex.size()-1i 作为索引

for(int i : ex) {

将值ex.get(0)ex.get(1) 输入i。它是内容

第二种情况,逻辑应该是

int j = 0;
for (int i : ex) {
  if(x.get(0) == i && y.get(0) == ey.get(j)){
    ..
  }
  j++;
}

在这种情况下,增强的 for 意义不大。

如果它可以帮助您可视化,增强的东西,变量必须始终是数组/迭代器的类型(在这种情况下,您可以将Integer 自动发送到int

【讨论】:

  • 哇,非常感谢!像魅力一样工作,我以前从未见过它使用过,所以我很高兴我学到了一些东西。
【解决方案2】:

据我了解,您有一个 x,y 网格,其中有导致用户死亡的坐标。当您的用户在网格中移动时,您想检查他们当前所在的方格是否为坏方格。

最好将其存储为multidimensional array,而不是两个 ArrayList。

class Grid {

    private int[][] spaces;

    public Grid(int xdim, int ydim) {
        spaces = new int[xdim][ydim];
        for (int x=0; x<xdim; x++) {
            for (int y=0; y<ydim; y++) {
                spaces[x][y] = 0;
            }
        }
    }

    private void addBadSpace(int x, int y) {
        spaces[x][y] = 999;
    }

    private boolean isBadSpace(int x, int y) {
        return (spaces[x][y] != 0);
    }

}

您是否采用这种方法取决于您的应用程序和网格的大小。多维数组会很快,但会占用大量内存空间。如果它是一个稀疏矩阵(即存在很少的“坏”空间)并且您的网格非常大,那么有更有效的方法。

【讨论】:

  • 这实际上是一个非常好的主意,我一定会添加这个并自己尝试一下!感谢您添加此内容。
猜你喜欢
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
相关资源
最近更新 更多