Java中整数数组的ArrayList

Java中整数数组的ArrayList,java,arraylist,Java,Arraylist,各位 我刚刚进入Java,我正在尝试编写一个简单的游戏,在这个游戏中,敌人在网格上追逐玩家。我使用的是维基百科页面上关于寻路的简单算法。这涉及到创建两个列表,每个列表项包含3个整数。下面是我尝试构建和显示这样一个列表的测试代码 当我运行以下代码时,它会为ArrayList中的每个数组打印出相同的数字。为什么会这样 public class ListTest { public static void main(String[] args) { ArrayList<Integer[]

各位

我刚刚进入Java,我正在尝试编写一个简单的游戏,在这个游戏中,敌人在网格上追逐玩家。我使用的是维基百科页面上关于寻路的简单算法。这涉及到创建两个列表,每个列表项包含3个整数。下面是我尝试构建和显示这样一个列表的测试代码

当我运行以下代码时,它会为ArrayList中的每个数组打印出相同的数字。为什么会这样

public class ListTest {

public static void main(String[] args) {
    ArrayList<Integer[]> list = new ArrayList<Integer[]>(); 
    Integer[] point = new Integer[3];
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 3; j++) {
            point[j] = (int)(Math.random() * 10);
        }            

        //Doesn't this line add filled Integer[] point to the 
        //end of ArrayList list?
        list.add(point);      

        //Added this line to confirm that Integer[] point is actually 
        //being filled with 3 random ints.
        System.out.println(point[0] + "," + point[1] + "," + point[2]);
    }
    System.out.println();

    //My current understanding is that this section should step through 
    //ArrayList list and retrieve each Integer[] point added above. It runs, but only 
    //the values of the last Integer[] point from above are displayed 10 times.
    Iterator it = list.iterator();
    while (it.hasNext()) {
        point = (Integer[])it.next();  
        for (int i = 0; i < 3; i++) {
            System.out.print(point[i] + ",");
        } 
            System.out.println(); 
        } 
    }
}
公共类列表测试{
公共静态void main(字符串[]args){
ArrayList=新建ArrayList();
整数[]点=新整数[3];
对于(int i=0;i<10;i++){
对于(int j=0;j<3;j++){
点[j]=(int)(数学随机()*10);
}            
//这行不是将填充整数[]点添加到
//ArrayList列表的结尾?
列表。添加(点);
//添加此行以确认整数[]点实际上是
//被3个随机整数填充。
System.out.println(点[0]+”,“+点[1]+”,“+点[2]);
}
System.out.println();
//我目前的理解是,这一部分应该逐步完成
//ArrayList列出并检索上面添加的每个整数[]点。它运行,但仅
//上面最后一个整数[]点的值显示10次。
Iterator it=list.Iterator();
while(it.hasNext()){
point=(整数[])it.next();
对于(int i=0;i<3;i++){
系统输出打印(点[i]+“,”);
} 
System.out.println();
} 
}
}

除了另一个答案中的问题外,还需要对其进行两次cal.next(),这会导致迭代器向前移动两次,显然这不是您想要的。代码如下所示:

element = (int[])it.next()); 
String el = (String)element;
但事实上,我没看到你用过艾尔。虽然这是合法的,但似乎毫无意义。

您还有一个额外的
这里:

element = (int[])it.next()); //with the extra parenthesis the code will not compile 
应该是:

element = (int[])it.next(); 

我强烈建议将包含3个数字的整数数组封装到一个有意义的类中,该类将保存、显示和控制包含3个整数的数组


然后在你的main中,你可以有一个不断增长的该类对象的数组列表。

首先,其他一些答案是误导和/或不正确的。请注意,数组是一个对象。因此,无论数组本身是否包含基元类型或对象引用,都可以将它们用作列表中的元素

接下来,将变量声明为
List
比将其声明为
ArrayList
更可取。这允许您轻松地将
列表
更改为
链接列表
或其他实现,而无需中断其余代码,因为它保证只使用
列表
界面中可用的方法。有关更多信息,您应该研究“接口编程”

现在回答你真正的问题,这只是作为一个评论。让我们看几行代码:

Integer[] point = new Integer[3];
显然,这一行创建了一个
Integer
s数组

for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 3; j++) {
        point[j] = (int)(Math.random() * 10);
    }            

    //Doesn't this line add filled Integer[] point to the 
    //end of ArrayList list?
    list.add(point);
    //...
}
for(int i=0;i<10;i++){
对于(int j=0;j<3;j++){
点[j]=(int)(数学随机()*10);
}            
//这行不是将填充整数[]点添加到
//ArrayList列表的结尾?
列表。添加(点);
//...
}
在这里,您为数组的元素赋值,然后将数组的引用添加到
列表中。每次循环迭代时,将新值分配给同一数组,并将对同一数组的另一个引用添加到
列表
。这意味着
列表
对重复写入的同一数组有10个引用

Iterator it=list.Iterator(); while(it.hasNext()){ point=(整数[])it.next(); 对于(int i=0;i<3;i++){ 系统输出打印(点[i]+“,”); } System.out.println(); } }

现在,这个循环将相同的数组打印10次。数组中的值是上一个循环结束时设置的最后一个值

要解决此问题,只需确保创建10个不同的数组

最后一个问题:如果将
it
声明为
Iterator it
(或
Iterator it
),则不需要强制转换
it.next()的返回值。事实上,这是首选的,因为它是类型安全的


最后,我想问一下每个数组中的
int
s代表什么?您可能希望重新审视您的程序设计并创建一个类,将这三个
int
s作为数组或三个成员变量保存。

编译此代码时会发生什么?它将运行(我在Netbeans IDE中编写),但它会打印相同的随机数,例如9,9,2十次。您的原始代码使用
int[]
s做同样的事情吗?谢谢。我应该很清楚,我包括这两行只是为了说明我可能误解了如何从列表中检索对象。我建议更进一步,创建一个类,清楚地描述这三个
int
的含义。例如,如果它们是(x,y,z)坐标,则创建一个名为
Point
的类,其中包含三个名为
x
y
z
的成员变量。哇,非常感谢您的全面响应。我做了你建议的修改,效果很好。而且,你真的让它在我的脑海里滴答作响。整数数组使用整数计数器表示x和y坐标对,整数计数器表示从起点开始在网格上的步长。我想我明白你的意思了,创建一个类点来进行比较等等。我马上就去做。干杯@在这种情况下,我建议
Point
只包括
x
y