Java呈现问题以填充HashMap

时间:2020-09-28 22:39:04

标签: java hashmap

下面的代码在填充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);
}

enter image description here

2 个答案:

答案 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。问题就在那里,而不是您粘贴的内容。