2

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

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

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

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

我怎么能做这样的事情?

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,等等Vector2Vector3你应该把它们放在一个数组中。然后您可以使用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 回答