代码之家  ›  专栏  ›  技术社区  ›  developer

Java中的ArrayList有问题

  •  2
  • developer  · 技术社区  · 14 年前

    我无法正确添加我的ArrayList。当我在for循环完成后打印ArrayList时,ArrayList的长度是正确的,但是每个元素都是相同的(创建的最后一个坐标)。

    public class test {
    
    private static ArrayList<Coordinate> mOrigCoords;
    private static ArrayList<Coordinate> mNewCoords;
    private static int mListSize;
    private static int mPixelsX;
    
    public static void main(String[] args) 
    {
    
        mOrigCoords = new ArrayList<Coordinate>();
        mNewCoords  = new ArrayList<Coordinate>();
    
        mPixelsX = 480;
    
        int j = 0;
    
        Coordinate newCoord = new Coordinate(0,0);
    
        for(int i = 0; i < 96; i++)
        {
            j = j + 5;
    
            newCoord.setX(j);
            newCoord.setY((int)(Math.random()*300));
    
            mOrigCoords.add(newCoord);
        }
    
        mListSize = mOrigCoords.size();
    
        for(int n = 0; n < mListSize; n++)
        {
            System.out.println("test " + mOrigCoords.get(n).toString());
        }
    
    }
    }
    

    提前谢谢你的帮助!

    7 回复  |  直到 14 年前
        1
  •  10
  •   Lajos Arpad    14 年前

    而不是

    Coordinate newCoord = new Coordinate(0,0);
    
        for(int i = 0; i < 96; i++)
        {
            j = j + 5;
    
            newCoord.setX(j);
            newCoord.setY((int)(Math.random()*300));
    
            mOrigCoords.add(newCoord);
        }
    

    Coordinate newCoord = null;
    
    for(int i = 0; i < 96; i++)
    {
        newCoord = new Coordinate(0,0);
        j = j + 5;
    
        newCoord.setX(j);
        newCoord.setY((int)(Math.random()*300));
    
        mOrigCoords.add(newCoord);
    }
    

    这样,arrayList将保存许多对象,而不是只有一个对象。ArrayList中的所有元素都指向同一个对象,这就是问题的原因。

        2
  •  4
  •   Michaël BadZen    14 年前

    你必须这样做:

    Coordinate newCoord;
    for(int i = 0; i < 96; i++)
        {
        newCoord = new Coordinate(0,0);
        ...
    

    因为在您的情况下,每次都设置相同的对象(newCoord)。

        3
  •  2
  •   drekka    14 年前

    这是因为每次循环中都要添加相同的坐标对象。您需要为循环的每次迭代创建新的坐标对象。

        4
  •  2
  •   Jason Rogers    14 年前

    你的问题是你永远不会创建你的合作伙伴的新实例。所以每次修改newCoord时都要修改同一个实例。

    试试这个

    for(int i = 0; i < 96; i++)
    {
        j = j + 5;
    
        //newCoord.setX(j);
        //newCoord.setY((int)(Math.random()*300));
    
        mOrigCoords.add(new Coordinate(j,(int)(Math.random()*300)));
    }
    
    mListSize = mOrigCoords.size();
    
    for(int n = 0; n < mListSize; n++)
    {
        System.out.println("test " + mOrigCoords.get(n).toString());
    }
    
        5
  •  2
  •   Sanjay Jain    14 年前

    在上面的代码中,您每次都要添加同一个实例,您只创建了一个实例,并一次又一次地添加它,直到循环迭代。

    如另一个解决方案所示。 希望这对你有帮助。

        6
  •  0
  •   akf    14 年前

    在每次迭代中,您都要重新添加 Coordinate

        7
  •  0
  •   mrv    13 年前

    这是因为X和Y是“Coordinate”类的属性,是静态属性,所以对象在内存中有它们的一个副本。所有实例都指向同一地址。您不应该使用“static”关键字,以便它们可以使用自己的副本并具有不同的值。