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を初期化し、この後に第1の方法に比べて多数のアレイを初期化するより良い方法は、実際に存在しませんか?記述的に名前を付ける必要がある多数の配列を格納する全体的なアプローチが改善されていますか?私は二次元の配列でデータを格納することができるようにしたいと思いますが、残念ながらこれらの値は説明的である必要があります。

参考までに、これらの配列は、作成時にオブジェクトインスタンスに渡されるリストから割り当てられるため、初期化する必要があります。初期化されていない変数に値を割り当てることができないか、NullPointerExceptionが返されます。例えば:上記初期化の第二(無効)メソッドを使用する場合

a[index] = listWithDataIWantToAssign.get(listIndex); 

NullPointerExceptionを返します。

+0

あなたはArrayList'だけのこのアプローチは、非常に強い香りを持っている – emotionlessbananas

+2

を求め '試すことができます1つのクラスは現実的により多くの責任を負います。各アレイを別のアレイから独立させることができますか?つまり、 'd'から独立して' c'を宣言して別々の場所に居ることができますか? – Makoto

+0

配列メンバーを持つクラスはどうですか? –

答えて

1

オブジェクト。 double[][] myArray = new double[90][3]

説明的に名前を付ける必要がある多数の配列を格納する全体的なアプローチが優れていますか?

すべての変数に名前が付けられていると、すべての名前を入力するのが困難になります。しかし、名前変数の代わりに、静的な名前を使ってint型で名前を付けるのはなぜですか?あなたがそのようなすべての名前に保ちクラスを作成することができます

:次に、あなたのコード内で

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

をこれらの変数を使用

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

は本当に多数を初期化する良い方法はありませんこの投稿の最初の方法よりも配列が多いですか?

本当に大きな配列のammoutがある場合は、最初はすべての配列を初期化するのにはあまり役に立ちません。あなたは怠惰な負荷に配列することができますし、

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

'List ' - これらの配列が何らかの本質的なやり方でやりとりされることになっているのであれば、これは最善のアプローチではありません... – Makoto

+0

私は答えをマコート、コメントありがとう....:P –

+0

ありがとうなぜなら、このプログラムの複雑さの大部分は、その振る舞いを管理する方程式から来ていることを考えると、私は多くの可読性を失います。本当にわかっているのは、コレクションに含まれていないJavaで多数の変数を柔軟に初期化できる方法があるかどうかということです。 – XeroG

1

次のコードは、[double]プリミティブの2次元配列を返します。サイズは[N] [3]です。 Nはアレイの数、又はあなたの例でであり、各アレイ内の3つの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; 
} 

、次のコードは、各要素がダブル[]配列されたリストを返します3でダブルは、アレイの大ammountで動作するようにしている場合ではなく、変数の過度なammountの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; 
} 
関連する問題