用对象填充数组列表,导致列表中的所有元素都相同

时间:2013-04-13 03:07:33

标签: java

我正在尝试使用从表示点的文本文件(每行两个整数)读取整数而创建的对象填充arrayList。我试图在循环中这样做。 ArrayList似乎填满了,但是当我打印出来之后,每个索引中的所有元素都与添加到ArrayList的最后一个元素相同。这似乎与指向对象的每个arrayList索引有关(我的新手猜测)。我是否必须为每个arrayList条目创建唯一对象?是否有一种简单的方法可以添加到此代码中来执行此操作?

public class Point2DDemo extends Point2D<Double>
{
    ArrayList<Point2DDemo> Points = new ArrayList<Point2DDemo>(7);


    /**
     * Constructor for objects of class Point2DDemo
     */
    public Point2DDemo()
    {

    }

    public Point2DDemo(double first, double second)
    {
        setFirst(first);
        setSecond(second);
    }

    public void putPair(double point1, double point2){
        this.setFirst(point1);
        this.setSecond(point2);
    }

    /**
     * 
     * 
     * @param  y   a sample parameter for a method
     * @return     the sum of x and y 
     */
    public void createList()
    {
        FileIO readFile = new FileIO();
        readFile.openInputFile();
        String pointLine = null;

        Point2DDemo newPoints = new Point2DDemo();

        StringTokenizer stringSplit = null;

        while(readFile.hasInputLine())
        {

           pointLine = readFile.readInputLine();
           stringSplit = new StringTokenizer(pointLine);

           double pointX = Double.parseDouble(stringSplit.nextToken());
           double pointY = Double.parseDouble(stringSplit.nextToken());


           newPoints.putPair(pointX, pointY);

           Points.add(newPoints);





        }
        for(int i = 0; i < Points.size(); i++)
         System.out.println(Points.get(i));

         readFile.closeInputFile();

    }

3 个答案:

答案 0 :(得分:1)

显然,代码中只有一个Point2DDemo对象newPoint。在while循环中,您正在使用不同的值更改相同的newPoint,并且它最终具有一对值。

您应该在循环时放置Point2DDemo newPoints = new Point2DDemo(); INTO:

public void createList()
{
    FileIO readFile = new FileIO();
    readFile.openInputFile();
    String pointLine = null;

    StringTokenizer stringSplit = null;

    while(readFile.hasInputLine())
    {


       Point2DDemo newPoints = new Point2DDemo();
       pointLine = readFile.readInputLine();
       stringSplit = new StringTokenizer(pointLine);

       double pointX = Double.parseDouble(stringSplit.nextToken());
       double pointY = Double.parseDouble(stringSplit.nextToken());


       newPoints.putPair(pointX, pointY);

       Points.add(newPoints);

    }
    for(int i = 0; i < Points.size(); i++)
     System.out.println(Points.get(i));

     readFile.closeInputFile();

}

答案 1 :(得分:0)

您目前所做的只是重复设置单个Point2DDemo的值,并将多个引用添加到ArrayList

回答你的问题:是的,你需要为每组点创建一个新的对象。

类似的东西:

Point2D point = new Point2D( xPoint, yPoint );

应该这样做。 (这段代码不会按照书面形式运作,但会让你朝着正确的方向前进。)

答案 2 :(得分:0)

您可以使用references将数组列表填充到相同的对象。

在循环中,您需要为每次迭代创建 new newpoints

这些方面的东西:

// Outside of the lopp
Pont2DDemo newpoints;

// inside the loop
newpoints = new Point2DDemo();
newPoints.putPair(pointX, pointY);
Points.add(newPoints);