2012-10-26 83 views
2

我有一段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

+1

这不是一个答案,但是是在哪里寻找线索。在C#中,我会用反射来做这件事。您必须使用字符串名称获取表示该属性的对象,然后调用它。这是因为java编译安全,因此不会让你直接像你在代码中那样做。 – Rob

+0

你真正应该做的就是把这些矢量放在散列表中,并通过“vector1”键入它们......“vectorN”字符串 – amphibient

+1

@foampile这是正确的想法,但容器错误。键入字符串的关联数组不是必需的。这是一个具有整数指数的传统数组。 –

回答

3

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

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

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

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

+0

不幸的是,正如我在原始文章中提到的,以一种您建议的方式重命名向量对我来说不是一种选择:-( – user1777928

+0

)您不重命名任何东西,而是在您的代码中声明数组。引用原始对象,它是适配器模式。 –

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]); 
    } 
} 
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); 
} 
相关问题