2012-10-26 119 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); 
} 
相關問題