使用for循环时,Java ArrayList存储不同的值

时间:2016-04-02 05:16:22

标签: java arraylist

我正在尝试生成半径为1的圆的x和y值,对于x = rcos(a)和y = rsin(a),但是当我使用下面三种不同的方法时,我只得到正确的值只能手动添加它们,但我想将它们添加到循环中。

 ArrayList<Double> cCoords = new ArrayList<Double>();
 double pi = Math.PI;
 double pi_over_two = Math.PI/2.0;
 double pi_over_four = Math.PI/4.0;
 double pi_over_180 = Math.PI / 180.0;
 double piVals = 0;


 cCoords.add(Math.cos(0));
 cCoords.add(Math.sin(0));
 cCoords.add(Long.valueOf(Math.round(Math.cos(pi_over_two))).doubleValue());
 cCoords.add(Math.sin(pi_over_two));
 cCoords.add(Math.sin(pi_over_two+pi_over_two+pi_over_two));

////////Below values are printed correctly

    cCoords.add(Math.cos(pi_over_four) );
    cCoords.add(Math.sin(pi_over_four));

    cCoords.add(Math.cos(pi_over_four+pi_over_four));
    cCoords.add((Math.sin( pi_over_four+pi_over_four)) );

    cCoords.add( Math.cos(pi_over_four+pi_over_four+pi_over_four) );
    cCoords.add(Math.sin(pi_over_four+pi_over_four+pi_over_four));

    cCoords.add(Math.cos(pi_over_four +pi_over_four+pi_over_four+pi_over_four) );
    cCoords.add(Math.sin(pi_over_four +pi_over_four+pi_over_four+pi_over_four));

    cCoords.add(Math.cos(pi_over_four+pi_over_four + pi_over_four+pi_over_four+pi_over_four));
    cCoords.add(Math.sin( pi_over_four+pi_over_four +pi_over_four+pi_over_four+pi_over_four) );

    cCoords.add( Math.cos(pi_over_four+pi_over_four+pi_over_four +pi_over_four+pi_over_four+pi_over_four) );
    cCoords.add(Math.sin(pi_over_four+pi_over_four+pi_over_four + pi_over_four+pi_over_four+pi_over_four));


//////////////Above values are printed correctly


    for(int i = 0; i < 6; i++) { // Wrong values

        cCoords.add(i, Math.cos(pi_over_four) );
        cCoords.add(i+1, Math.sin(pi_over_four));

        pi_over_four+=pi_over_four;

    }
/////


    for(int i = 0; i < 6; i++) { // x=1 coordinate gets repeated with different y values

        cCoords.add( Math.cos(pi_over_four) );
        cCoords.add( Math.sin(pi_over_four));

        pi_over_four+=pi_over_four;

    }

////

    for(int i = 0; i < cCoords.size()-1; i+=2) {
        System.out.print("(" + cCoords.get(i) + ",");
        System.out.println(cCoords.get(i+1) + ")\n");
    }

2 个答案:

答案 0 :(得分:2)

您获取的值不正确,因为在更改变量pi_over_four本身的值后,您在循环中插入了错误的值。

例如,在您所说的正确打印值的下面的代码段中,您已经将下一次迭代的值加倍,即2 * pi_over_four来自pi_over_four

cCoords.add(Math.cos(pi_over_four));
cCoords.add(Math.sin(pi_over_four));

cCoords.add(Math.cos(pi_over_four + pi_over_four));
cCoords.add(Math.sin(pi_over_four + pi_over_four)); 

在下一次迭代中,它变为3 * pi_over_four

cCoords.add(Math.cos(pi_over_four + pi_over_four + pi_over_four));
cCoords.add(Math.sin(pi_over_four + pi_over_four + pi_over_four)); 

请注意,您在此处不会更改变量pi_over_four的值。您只是在执行n * pi_over_four,然后将其存储回列表中。

但是如果你仔细看到你的循环,你就会改变pi_over_four本身的值,这是错误的。你应该做的事情是这样的:

for(int i = 0; i < 6; i++) {
    cCoords.add(i, Math.cos((i + 1) * pi_over_four));
    cCoords.add(i+1, Math.sin((i + 1) * pi_over_four));
}

答案 1 :(得分:1)

每次循环时,

pi_over_four都在变化,所以实际上,每次将它乘以2 ^ x而不是将其乘以2,其中x是i + 1。想象一下,在第一个循环中,pi_over_four等于pi / 4,在第二个循环上它等于pi / 2,但是你将pi / 2加到pi / 2而不是pi / 4,从而产生第三个循环它等于pi。将新的pi_over_four存储在另一个变量中以解决此问题。