簡體   English   中英

如何在迭代時添加到 HashMap 內的 ArrayList

[英]How Do I add to an ArrayList within a HashMap while iterating

在為我的文件大學項目遵循 LWJGL 教程系列時,我向世界添加了具有關聯網格 class 的游戲項目,

如果我要向世界添加許多共享相同網格的對象,將游戲項目列表關聯到一個網格類型然后從那里渲染會更有效

private Map<Mesh, List<GameItem>> meshMap;

meshMap = new HashMap();

     public void addDynamicGameItem(DynamicGameItem dynamicGameItem) {
    numGameItems++;
        Mesh[] meshes = dynamicGameItem.getMeshes();
        for(Mesh mesh : meshes) {
            List<GameItem> list = tempMap.get(mesh);
            if (list == null) {
                list = new ArrayList<>();
                tempMap.put(mesh, list);
            }
            list.add(dynamicGameItem);
        }
}

直到我嘗試在 hashmap 被迭代時向世界添加新的游戲項目之前,這一切正常,對 addStaticGameItem 的任何后續調用似乎都會將新項目的游戲邏輯添加到世界,但網格沒有正確添加,因此根本看不到。

這里是調用 hashmap 進行渲染的地方:

Map<Mesh, List<GameItem>> mapMeshes = scene.getGameMeshes();
    for (Mesh mesh : mapMeshes.keySet()) {
        if(mesh.getMaterial() != null) {
            sceneShaderProgram.setUniform("material", mesh.getMaterial());
            Texture text = mesh.getMaterial().getTexture();
            if (text != null) {
                sceneShaderProgram.setUniform("numCols", 
                text.getNumCols());
                sceneShaderProgram.setUniform("numRows", 
                text.getNumRows());
            }
        }
          mesh.renderList(mapMeshes.get(mesh), (GameItem gameItem) -> {
                    sceneShaderProgram.setUniform("selected", 
                    gameItem.isSelected() ? 1.0f : 0.0f);
                    Matrix4f modelViewMatrix = 
                    transformation.buildModelViewMatrix(gameItem, 
                    viewMatrix);
                    sceneShaderProgram.setUniform("modelViewMatrix", 
                    modelViewMatrix);
                    Matrix4f modelLightViewMatrix = 
                    transformation.buildModelLightViewMatrix(gameItem, 
                    lightViewMatrix);
                    sceneShaderProgram.setUniform("modelLightViewMatrix", 
                    modelLightViewMatrix);
                }
        );
    }

那么如何在迭代時正確地將新值添加到 Hashmap 列表中?

編輯:這有效

public void updateMeshMap(){
    if(!tempMap.isEmpty()){
        for(Mesh m : tempMap.keySet()){
            List list = meshMap.get(m);
            if (list == null) {
                list = new ArrayList<>();
                list.addAll(tempMap.get(m));
                meshMap.put(m, list);
            }else{
                list.addAll(tempMap.get(m));
            }
        }
    }
    tempMap = new HashMap<Mesh, List<GameItem>>();
}

您實際上無法在迭代時向 HashMap 添加新值。 但是您可以嘗試創建一個臨時的 map tempMap ,向該tempMap添加新項目,然后在迭代后更改您原來的 HashMap (您可以使用meshMap.putAll(tempMap) )。

另請查看HashMap 文檔在哪里可以找到

所有此類的“集合視圖方法”返回的迭代器都是快速失敗的:如果 map 在創建迭代器后的任何時間進行結構修改,除了通過迭代器自己的 remove 方法之外,迭代器將拋出 ConcurrentModificationException .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM