我正在尝试使用随机大小和随机位置的对象/**
* @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);
}
答案 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中。浅拷贝只是原始数据指针的副本,而不是数据本身。由于这个原因,幕后可能会发生错误。尝试通过创建包含实际数据的深层副本来添加圆形对象。