1

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

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

+0

你可以试试'ArrayList'只是要求 – emotionlessbananas

+2

这种方法具有的很强的气味一个班级承担的责任比实际应该承担的要多。每个阵列可以独立于另一个阵列吗?也就是说,你可以独立于'd'声明'c'并让它们生活在不同的地方吗? – Makoto

+0

数组成员怎么样? –

回答

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]; 

使用这些变量是真的没有更好的办法来初始化大量数组比在这篇文章中的第一个方法?

如果你有一个非常大的数组ammout,在开始时初始化所有数组并不是很有用。您可以延迟加载的阵列,并使用getter上设置者

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]; 
0

由于清单不可能,你应该考虑创建自己的工厂,最好的办法,提高了一点,也许与大小和初始值打...

,如:

public class MyClass implements IArrayFactory { 

    public static void main(String[] args) { 
    MyClass foo = new MyClass(); 
    List<List<Double>> l = new ArrayList<>(); 
    for (int i = 0; i < 10; i++) { 
     l.add(foo.getListDouble(3, 0.0)); 
    } 
    System.out.println(l); 
    } 

    @Override 
    public List<Double> getListDouble(int size, double initVal) { 
    Double[] d = new Double[size]; 
    Arrays.fill(d, initVal); 
    return Arrays.asList(d); 
    } 
} 

interface IArrayFactory { 
    List<Double> getListDouble(int size, double initVal); 
} 
+0

'列表' - 不是最好的方法,如果这些阵列是为了以一些理智的方式进行交互... – Makoto

+0

我改进了答案@Makoto,感谢评论....:P –

+0

感谢您的双列表工厂,但由于我只能通过其索引来表示ArrayList 的值,所以我失去了很多可读性,特别是考虑到该程序的很多复杂性来自于控制其行为的方程式。真正希望发现的是,是否有一种方法可以灵活地初始化Java中的大量变量,而不是包含在集合中。 – XeroG

1

以下代码将返回大小为[N] [3]的'double'原语的2d数组。 N是阵列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; 
} 

替代地,下面的代码将返回一个列表,其中每个元素是一个双[]数组与三个双对象

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; 
}