大家。
我刚刚进入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();
}
}
}
答案 0 :(得分:8)
首先,其他几个答案都具有误导性和/或不正确性。请注意,数组是一个对象。因此,无论数组本身是否包含基本类型或对象引用,您都可以将它们用作列表中的元素。
接下来,将变量声明为List<int[]> list
比将其声明为ArrayList<int[]>
更为可取。这使您可以轻松地将List
更改为LinkedList
或其他一些实现,而不会破坏其余代码,因为它保证仅使用List
接口中可用的方法。有关更多信息,您应该研究“编程到界面。”
现在回答您的真实问题,该问题仅作为评论添加。我们来看几行代码:
Integer[] point = new Integer[3];
这一行显然创建了一个Integer
的数组。
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);
//...
}
在这里,您可以为数组元素指定值,然后将引用添加到数组中List
。每次循环迭代时,都会将新值分配给同一个数组,并将对同一数组的另一个引用添加到List
。这意味着List
有10个引用到同一个数组,已经反复写入。
Iterator it = list.iterator(); while(it.hasNext()){ point =(Integer [])it.next(); for(int i = 0; i&lt; 3; i ++){ System.out.print(point [i] +“,”); } 的System.out.println(); } }
现在这个循环打印出相同的数组 10次。数组中的值是在上一个循环结束时设置的最后一个值。
要解决此问题,您只需确保创建10个不同的数组。
最后一个问题:如果您将it
声明为Iterator<Integer[]> it
(或Iterator<int[]> it
),则无需转换it.next()
的返回值。事实上,这是首选,因为它是类型安全的。
最后,我想问一下每个数组中的int
代表什么?您可能希望重新访问程序设计并创建一个包含这三个int
的类,作为数组或三个成员变量。
答案 1 :(得分:2)
这里有一个额外的)
:
element = (int[])it.next()); //with the extra parenthesis the code will not compile
应该是:
element = (int[])it.next();
答案 2 :(得分:2)
我强烈建议将3个数字的整数数组包含在一个有意义的类中,它将保存,显示和控制3个整数的数组。
然后在你的主体中,你可以拥有一个不断增长的该类对象的ArrayList。
答案 3 :(得分:1)
除了另一个答案中的问题,你将it.next()调整两次,这会导致迭代器向前移动两次,显然这不是你想要的。像这样的代码:
element = (int[])it.next());
String el = (String)element;
但实际上,我没有看到你使用el。虽然这是合法的,但似乎毫无意义。