2

我想全局更新对对象的引用(与更新对象时更新对象的所有引用(对引用的引用)几乎相同的问题)。

我有以下代码结构:

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)。顶点包含 then [a,b,c,d,e,f,g,h]

在一种算法中,我需要用另一个顶点替换一个顶点。例如e被删除并替换为a.

通常,您将使用以下代码执行此操作以获取更新的TrianglesT1(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);

谢谢

4

2 回答 2

3

在我看来,顶点类应该只是可变的,你应该改变它的坐标:

e.setCoordinates(a.getCoordinates());

这样,所有对 e 的引用都会自动获取新坐标。如果这不是一个选项,也许您应该将 Vertex 对象包装成一个MutableVertex对象,并使三角形对象和顶点列表包含MutableVertex.

于 2012-10-28T17:45:45.463 回答
0

您可以有一个“智能”列表实现,它可以即时查找顶点。例如,它可能有

int size() { return triangles.size() * 3; }

顶点 get(int i) {return triangles.get( i / 3 ).getVertex(i % 3); }

或类似的东西。考虑扩展 java.util.AbstractList。

于 2012-10-28T18:39:48.963 回答