将一个双精度数组作为数组传递给一个需要双数组的函数--Java

时间:2017-10-22 17:12:39

标签: java arrays

我正在尝试创建一个Planet类,我想将行星的速度,加速度,位置设置为默认值。我有setter函数来做到这一点,但他们期望一个双数组。将一个数字列表作为参数传递是非常方便的,因为每次初始化一个新行星时我都不想创建一个零数组。

嗯,总结一下,我想默认做这样的事情:

    public Planet(){
        dimension = 3;
        mass = 1;
        acceleration = new double[dimension];
        velocity = new double[dimension];
        location = new double[dimension];
        this.setLocation({0,0,0}); // Is this possible?
        this.setVelocity({0,0,0}); // ?
        this.setAcceleration({0,0,0}); // ?
    }

我的二传手看起来像这样:

    public void setVelocity(double[] velocity){
        for(int i = 0; i < dimension; i++){
            this.velocity[i] = velocity[i];
        }
    }

我对Java很新,可能这是可能的,但我自己找不到解决方案。在C ++中,初始化列表可以实现这一点,但谷歌搜索建议Java没有。

4 个答案:

答案 0 :(得分:1)

您可以使用以下语法传递一个匿名的双精度数组:

new double[]{...} 

在你的情况下它会是这样的:

this.setLocation(new double[]{0,0,0});
this.setVelocity(new double[]{0,0,0}); 
this.setAcceleration(new double[]{0,0,0}); 

答案 1 :(得分:1)

在Java中,所有数组都是预初始化的(与C / C ++相反),因此在创建双精度数组时

velocity = new double[dimension];

您已使用以下值初始化

{ 0.0, 0.0, 0.0, ... }

如果您需要为每个元素分配其他值,则可以使用Arrays#fill()方法。

答案 2 :(得分:0)

我建议您绕过setter并在默认的Planet()构造函数中包含此行:

this.acceleration = new double[3] { 0.0, 0.0, 0.0 };

您可以对所有3个阵列执行此操作。

可以说,这是一种干净的方式来查看调用Planet()时得到的内容,而无需跳转到检查每个数组的setter方法。

答案 3 :(得分:0)

我已经通过一些额外的更改实现了您的课程:

public class Planet {
    private final int dimension;
    private final int mass = 1;
    private double[] acceleration;
    private double[] velocity;
    private double[] location;

    public Planet(//You can pass all of these fields here) {
        this.dimension = 3;
        this.mass = 1;
        this.setLocation(new double[]{0, 0, 0});
        this.setVelocity(new double[]{0, 0, 0});
        this.setAcceleration(new double[]{0, 0, 0});
    }

    public void setAcceleration(double[] acceleration) {
        this.acceleration = acceleration;
    }

    public void setVelocity(double[] velocity) {
        this.velocity = velocity;
    }

    public void setLocation(double[] location) {
        this.location = location;
    }
}

您告诉您不希望在构造函数中“创建”(初始化)数组。但是你必须至少一次初始化它们,例如你可以用其他方式:

private double[] acceleration = new double[dimension];
private double[] velocity = new double[dimension];
private double[] location = new double[dimension];

然后在构造函数中向这些数组添加值。但是这种变体只有在之前初始化尺寸时才有可能,因此它取决于您的设计。更可能的维度应该是常量,因此您可以将其初始化为:

private static final int DIMENSION = 3;

您可以使用第二种变体。如果只在构造函数中需要它们,你也可以摆脱setter。然后简单地说:

for(int i = 0; i < DIMENSION; i++) {
    acceleration[i] = 0; //or some other number passed to the constructor
}