Java中整数数组的ArrayList

时间:2012-12-02 00:23:32

标签: java arraylist

大家。

我刚刚进入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(); 
        } 
    }
}

4 个答案:

答案 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。虽然这是合法的,但似乎毫无意义。