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