我想全局更新对象的引用(与Update all references to an object when the object is updated(reference to a reference)几乎相同的问题)。
我有以下代码结构:
class Triangle {
Vertex pos[];
//...
}
ArrayList<Vertex> vertices;
ArrayList<Triangle> triangles;
// Load triangles from file. After all triangles are loaded,
// fill the vertices list with all vertices of all triangles.
正如您在代码示例中所看到的,首先加载了三角形。我的一些附加算法只需要所有顶点的列表。因此,为了提高性能,所有三角形的所有顶点都插入到顶点列表中,算法只获取列表。
我们假设我有三角形T1(a,b,c)
,T2(d,e,f)
和T3(e,g,h)
。
然后,顶点包含[a,b,c,d,e,f,g,h]
。
在一个算法中,我需要用另一个顶点替换顶点。例如,e
被删除并替换为a
。
通常情况下,您可以使用以下代码执行此操作,以获取更新的三角形T1(a,b,c)
,T2(d,a,f)
和T3(a,g,h)
:
for (Triangle t : triangles) {
for (int i=0; i<3; i++) {
if (t.pos[i] == e)
t.pos[i] = a;
}
}
是否有另一种方法可以有效地更新指向e
的所有引用,以便引用的新目标为a
。
例如,不是使用循环并迭代所有三角形(这不是那么有效),这样的调用将是有用的:
Java.updateReferences(e,a);
由于
答案 0 :(得分:3)
在我看来,顶点类应该只是可变的,你应该只改变它的坐标:
e.setCoordinates(a.getCoordinates());
这样,对e的所有引用都会自动获得新坐标。如果这不是一个选项,也许您应该将Vertex对象包装到MutableVertex
对象中,并使三角形对象和顶点列表包含MutableVertex
的实例。
答案 1 :(得分:0)
您可以拥有一个“智能”列表实现,可以动态查找顶点。例如,它可能有
int size(){return triangles.size()* 3; }
Vertex get(int i){return triangles.get(i / 3).getVertex(i%3); }
或类似的东西。考虑扩展java.util.AbstractList。