2

と として定義されたベクトルがある Java コードがありVector1, Vector2, Vector3,.....VectorNますoldVector1, oldVector2, oldVector3,...oldVectorN

Vector"i"これらすべてのベクトルに対して実行され、との各組み合わせのスカラー積を計算するループを作成する必要がありますoldVector"j"

実際、最善の方法は、個々のベクトルをすべてのベクトルを含む 1 つの配列に置き換えて、その配列で作業することです。

ただし、別のオブジェクトを保持する必要があるため、コードの残りの部分とベクトルの定義に触れることは許可されていません。

どうすればこのようなことができますか?

for (i = 1; i < 10; i++) {
  for (j = 1 ; i < 10; j++) {
    result[i][j] = dotproduct(Vector"i", oldVector"j");
  }
}

基本的に、Java で変数名を文字列のような egeg に構築する方法はあります"Vector"+iか?

4

3 に答える 3

3

中間コレクションを追加できますか?

たとえば、あなたはすることができます

Vector[] vectors = new Vector[];
Vector[] oldVectors = new Vector[];

vectors[1] = Vector1;
vectors[2] = Vector2;
... (etc.)

oldVectors[1] = oldVector1;
oldVectors[2] = oldVector2;

for (int i=1; i<10; i++) }
   for (int j=1; j<10; j++) {
      result[i][j] = dotproduct(vectors[i], oldVectors[j]);
   }
}
于 2012-10-26T18:57:13.200 に答える
3

Vector1オブジェクトにVector2、などの名前を付ける代わりに、Vector3それらを配列に入れる必要があります。その後、 を使用してそれらを参照できますv[i]

あなたは質問でこのアプローチに言及し、それを使用できないと言います。でも君ならできる。古いコードと新しいコードの間にレイヤーを追加するだけです。次のように配列を初期化します。

v[1] = Vector1;
v[2] = Vector2;
// etc.

配列インデックスを使用するコードを記述できるようになりましたが、変更が許可されていないコードの上に立っています。

于 2012-10-26T18:54:44.893 に答える
0

それらの参照がローカル変数かフィールドかによって異なります。それらがローカル変数である場合、おそらく運が悪いでしょう。おそらく、他の回答が示唆するように、それらを配列またはコレクションに貼り付けるか、(コードが単純であるか、関数に入れることができる場合)単に複製するかのいずれかです。それは臭いですが、問題はそもそも臭いです。

参照がオブジェクトのフィールドである場合は、リフレクションを使用してそれらをループすることを検討できます。アイデアは、含まれているオブジェクトのクラスを使用してフィールド名を解決することです。コードは次のようになります。

ContainingType containingObject = ...;
for (int i = 1; i < 10; i++) for (int j = 1; j < 10; j++) {
    Field vectorField    = ContainingType.class.getField("vector"    + i);
    Field oldVectorField = ContainingType.class.getField("oldVector" + j);

    Vector vector    = (Vector) vectorIField.get(containingObject);
    Vector oldVector = (Vector) oldVectorField.get(containingObject);
    result[i][j] = dotProduct(vector,oldVector);
}
于 2012-10-26T19:09:29.997 に答える