使用相同的值填充具有对象的ArrayList

时间:2017-07-25 14:30:25

标签: java arraylist

我正在尝试使用随机大小和随机位置的对象/** * @Route("/shop/add/{id}", name="add_article") * */ public function addArticlelAction(Request $request, $id) { $session = $request->getSession(); if (!$session->has('panier')) $session->set('panier', array()); $panier = $session->get('panier'); if (array_key_exists($id, $panier)) { if ($request->query->get('qte') != null) $panier[$id] = $request->query->get('qte'); } else { if ($request->query->get('qte') != null) $panier[$id] = $request->query->get('qte'); else $panier[$id] = 1; } $session->set('panier', $panier); return $this->redirectToRoute('panier'); } 来填充我的空ArrayList个“圈子”,稍后我将对其进行绘制。 Circle循环正常填充数组,但出于某种原因,当我用for复制它时,它不起作用。我还尝试使用circ.addAll(circles).clone(),但最终出现了nullpoint异常错误或所有具有相同值的圈子。这是我的代码。

circ = circles

我的Circle类看起来像这样:

public class board {
public static int size = 400;
public static ArrayList<Circle> circles;

public static void fillArray(ArrayList<Circle> circ){
    Random r = new Random();
    int rand = r.nextInt(10)+5;
    circles = new ArrayList<Circle>(rand);
    System.out.println("random ="+ rand);
    for(int i = 0; i< rand; i++){


        circles.add(new Circle(Circle.x, Circle.y,Circle.size));

        System.out.println(i+". "+ circles.get(i).x +" "+ circles.get(i).y +" size je "+ circles.get(i).size);
        //fills normaly
    }
        circ.addAll(circles);
        System.out.println("aaaaa"+circ.get(0).x);
        //why same values? 
    System.out.println("fillArray circles= " +circ.get(0).x+circ.get(0).y+ " "+circ.get(1).x);
}

public static void main(String[] args) {
    fillArray(circles);
}

2 个答案:

答案 0 :(得分:1)

  

我正在尝试使用随机大小和随机位置的对象toString()填充空ArrayList个“圈子”

但你不是那样做的。这条线

Circle

添加circles.add(new Circle(Circle.x, Circle.y,Circle.size)); Circle字段值。据推测,您的static课程有类似的内容:

Circle

因此,您将相同的值添加到列表中的所有圆圈。要随机化大小和位置,您需要使用您创建的public class Circle { public static int x, y, size; // perhaps with some initialized values public Circle(int x, int y, int size) { /* ... */ } } 实例。类似的东西:

Random
  

For循环填充数组通常,但出于某种原因,当我用circ.addAll(圆圈)复制它时,它不起作用。

您混淆了自己创建的2个列表 - circles.add(new Circle(r.nextInt(10)+5, r.nextInt(10)+5, r.nextInt(10)+5)); circ。您正在将引用circles传递给方法,该方法在方法范围内名为ArrayList<Circle> circles。这是多余的,因为您可以从方法中访问circ而不将其作为参数传递。我建议你先解决你的设计问题。

你可能想要做的是初始化static circles

circ

并注意传递给构造函数的参数是初始容量,这是一个性能参数,几乎可以肯定不应该是随机的。

一旦你这样做,行circ = new ArrayList<Circle>(); 毫无意义,应该删除。只需打印circ.addAll(circles);即可查看值(circ @Override的{​​{1}})。

注意:建议使用界面而不是实现来保存引用:Circle。当您所做的只是列表操作时,您不应该关心实现细节。

答案 1 :(得分:0)

circ.addAll(circles)可能无法正常工作,因为它只是制作浅层副本并将其添加到arraylist中。浅拷贝只是原始数据指针的副本,而不是数据本身。由于这个原因,幕后可能会发生错误。尝试通过创建包含实际数据的深层副本来添加圆形对象。