下面的代码在填充HashMap时表现出奇怪的行为。可以看出,有一个for
遍历Faces
的列表,并将一个IntegrationCellVertex
添加到称为每个values
的{{1}}的映射中。但是,在第一个循环中,它将此对象添加到列表的多个Face中(请参见以蓝色突出显示的图像)。任何人都不会知道会发生什么吗?不幸的是,代码太大,所以我只分享发生问题的部分。
非常感谢!
Face
面孔类:
int vertexCounter = 0;
for (Face face : this.getDomainDataStructure().getFacesList()) {
IPolygon polygon = face.faceToPolygon();
IPoint3d centroid = polygon.getCentroid();
IntegrationCellVertex integrationCellVertex = new IntegrationCellVertex();
integrationCellVertex.setPoint(centroid);
vertexCounter += 1;
integrationCellVertex.setLabel(String.valueOf(vertexCounter));
integrationCellVertex.setContainingFace(face);
face.setValue(MeshfreeModel.INTEGRATION_CELL_VERTEX, integrationCellVertex);
this.getModel().addIntegrationCellsVertex(integrationCellVertex);
}
答案 0 :(得分:1)
好吧,请看一下您的代码,这与您的描述完全不同。
您说:
可以看出,有一个for对象经过一张Faces列表,并将一个IntegrationCellVertex添加到映射中,称为每个Faces的值。
而向所有对象添加任何集成单元顶点的唯一的地方是
this.getModel().addIntegrationCellsVertex(integrationCellVertex);
显然是将其添加到this.getModel()
,而不是face
。
您的代码不包含对任何地图的任何put
调用,并且您的图片展示了在多张面孔的values
地图中相同值的情况。基本上,您粘贴的代码与您的问题无关,也许粘贴更多的代码,或者制作一个独立的测试用例。您的代码可能存在更多的问题,而不仅仅是它的功能和理解方式之间的联系。
如果您无法创建一个独立的测试用例,则face.setValue和model.addIntegrationCellsVertex都看起来像必需的源代码,需要将其添加到问题中,以便任何人了解您的问题。< / p>
答案 1 :(得分:1)
现在,您已经更新了代码,第二个答案:
您的代码无法导致您显示的调试状态,除非有人做了一些愚蠢的事情,例如:
Face a = this.getDomainDataStructure().getFacesList().get(0);
Face b = this.getDomainDataStructure().getFacesList().get(1);
a.setValues(b.getValues());
此时,a的值映射和b的值映射只是指向同一映射的指针。修改一个,然后另一个也修改(如果您在一张纸上写了一条街道地址,而我又写了另一张完全相同的地址,完全不同的纸,则您跟随您的纸并扔一块砖头通过窗户,后来我开车去那儿,我会发现一所被破坏的房屋。情况相同。
参加Face课。删除所有的二传手。将所有字段都设为最终字段。
现在,所有错误?这些是实际的有问题的地方,或者至少足够愚蠢,以至于其他代码(例如您粘贴的代码)将失败。修复THOSE。问题就在那里,而不是您粘贴的内容。