在Java中初始化大量数组?

时间:2016-07-01 17:11:43

标签: java arrays data-structures nullpointerexception initialization

我正在为一个工程应用程序编写一个程序,该程序需要大量的1x3数组来存储非常长的刚体力学方程的系数。因此,我有大约90个阵列需要符合非常具体和长期的工程语法。想象一下,我有以下几点:

double[] a = {0.0, 0.0, 0.0}
double[] b = {0.0, 0.0, 0.0}
double[] c = {0.0, 0.0, 0.0}
etc.......
double[] zz = {0.0, 0.0, 0.0}

你可以看到这很笨重。

据我所知,在阅读this discussion on primitive declaration in Java时,无法将变量列表初始化为相同的值。例如,在以下代码中:

double[] a, b, c, ...... zy, zz = new double[3];

然而,这只是初始化数组zz,是否真的没有比这篇文章中第一种方法更好的方法来初始化大量数组?是否有更好的整体方法来存储需要描述性命名的大量数组?我希望能够将数据存储在二维数组中,但遗憾的是这些值必须是描述性的。

作为参考,我需要初始化这些数组,因为分配给它们的数据源自在构造时传递给对象实例的列表。我无法为未初始化的变量分配值,或者我得到NullPointerException。例如:

a[index] = listWithDataIWantToAssign.get(listIndex);
当使用上面提到的第二种(无效)初始化方法时,

返回NullPointerException

3 个答案:

答案 0 :(得分:1)

以下代码将返回一个'double'基元的二维数组,其大小为[N] [3]。 N是数组的数量,或者示例中为 90 ,3是每个数组中的三个双数:

public static double[][] initDoubleArrays (int N) {     
    double[][] doublesArray = new double[N][3];     
    // the doubles will be set to 0.0 by default.
    return doublesArray;
}   

或者,以下代码将返回一个列表,其中每个元素都是具有三个Double对象的Double []数组

public static List<Double[]> initArrays (int nArrays) {
    List<Double[]> arrays = new ArrayList<Double[]>(nArrays);
    for (int i = 0; i<nArrays; i++) {
        Double[] doubles =  { 0.0, 0.0, 0.0 };
        arrays.add(doubles);
    }               
    return arrays;
}

答案 1 :(得分:1)

如果你必须使用大量的数组,最好使用双数组而不是过多的变量。我建议你创建一个简单的双数组double[][] myArray = new double[90][3]

  

是否有更好的整体方法来存储需要描述性命名的大量数组?

如果所有变量都被命名,则很难不输入所有名称。但是,为什么不使用静态名称来命名,而不是名称变量?

你可以创建一个类,保留所有名称:

public static class VariablesNames{
    private static int counter = 0;

    public static final int NAME_1 = counter++;
    public static final int NAME_2 = counter++;
    public static final int NAME_3 = counter++;
    ...
} 

然后在代码中使用这些变量

double val = myArray[VariablesNames.NAME_1][0];
  

是否真的没有比这篇文章中的第一种方法更好的方法来初始化大量数组?

如果你有一个非常大的数组,那么在开始时初始化所有数组并不是很有用。你可以延迟加载数组并在其上使用getter setter

double[][] myArray = new double[90][];

public void init(int position){
    if(myArray[position] == null){
        myArray[position] = new double[3];
    }
}

public double[] get(int position) {
    init(position);
    return myArray[position];
}


public void set(int position, List<Double> listWithDataIWantToAssign){
    init(position);
    for (int i = 0; i < 3; i++) {
        myArray[position][i] = listWithDataIWantToAssign.get(i);
    }
}

然后在代码中使用这些方法

set(VariablesNames.NAME_2, listWithDataIWantToAssign);
double val = get(VariablesNames.NAME_2)[1];

答案 2 :(得分:0)

由于列表不是最好的方法,你应该考虑创建自己的工厂,通过玩大小和初始值来改善一点...

像:

WEB-INF/lib/