在循环中使用对象名称作为变量

时间:2012-10-26 18:39:07

标签: java for-loop

我有一段Java代码,其中有向量定义为Vector1, Vector2, Vector3,.....VectorNoldVector1, oldVector2, oldVector3,...oldVectorN

我需要编写一个遍历所有这些向量的循环,并计算Vector"i"oldVector"j"的每个组合的标量积。

实际上我知道最好的方法是用一个包含所有向量的数组替换单个向量并使用数组。

但是我不允许触摸其余的代码,并且需要保留向量的定义作为单独的对象。

我该怎么办?

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

基本上,Javahow中是否有任何方法可以构造类似于字符串的变量名称,例如例如"Vector"+i

3 个答案:

答案 0 :(得分:3)

您应该将它们放在一个数组中,而不是命名对象Vector1Vector2Vector3等。然后,您可以使用v[i]来引用它们。

你在问题​​中提到这种方法,并说你不能使用它。但是你可以。您只需要在旧代码和新代码之间添加一个图层。像这样初始化数组:

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

现在您可以编写使用数组索引的代码,但仍然站在您不允许修改的代码之上。

答案 1 :(得分: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]);
   }
}

答案 2 :(得分: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);
}