Java - .putAll(t)到一个hashmap也会放入另一个hashmap

时间:2014-11-29 16:41:46

标签: java hashmap

问题:我是玩家。例如防守球员和中场球员。首先使用防守球员。他将被放入fieldPlayers的hashmap,然后放在底部。他我们被添加到defendingPlayers的hashmap中。 现在我是我的第二位球员,中场球员。每当我想将他添加到fieldPlyaers的hashmap,以及" fieldPlayers.get(" H")。putAll(t); "被执行。玩家也被添加到hashnding defendingPlayers中,在那条特定的行之后加入。

            HashMap<String,Map<String, Player>> fieldPlayers = new HashMap<String,Map<String, Player>>();
            HashMap<String,Map<String, Player>> bench =  new HashMap<String,Map<String, Player>>();

            HashMap<String,Map<String, Player>> attackingPlayers =  new HashMap<String,Map<String, Player>>();
            HashMap<String,Map<String, Player>> midfieldPlayers =  new HashMap<String,Map<String, Player>>();
            HashMap<String,Map<String, Player>> defendingPlayers =  new HashMap<String,Map<String, Player>>();

            ArrayList<String> listAttackingPositions = new ArrayList<String>(Arrays.asList("Sturm","Secondary_Striker"));
            ArrayList<String> listMidfieldPositions = new ArrayList<String>(Arrays.asList("Mittelfeld","Left_Midfield"));
            ArrayList<String> listDefendingPositions = new ArrayList<String>(Arrays.asList("Abwehr","Sweeper","Right-Back"));

            Player p  = null;
            for(int i=0; i < Math.max(sizeOutTeam, sizeHomeTeam); i++){

                    // If there exist homeplayers
                    if(homeTeam.get(i).entrySet().iterator().next().getKey()!= null){

                    // get the player, which is an object Player 
                            p  = listPlayers.get(homeTeam.get(i).entrySet().iterator().next().getKey());

                    // create a hashmap t, which is e.g.  <Messi, objectMessi>
                            HashMap<String, Player> t = new HashMap<String, Player>();
                            t.put(p.getName(), p);

                    // If the players starting minute is 0 then we put him in as a fieldplayer - otherwise he is a bench player
                          if((Integer)homeTeam.get(i).entrySet().iterator().next().getValue().get("start") == 0){
                                    sizeLineUp++;
                                    if(fieldPlayers.containsKey("H"))
                                            fieldPlayers.get("H").putAll(t); // <----Problem
                                    else
                                            fieldPlayers.put("H", t);
                                    homeRating += p.getRating();


                            }else{
                                    if(bench.containsKey("H"))
                                            bench.get("H").putAll(t);
                                    else
                                            bench.put("H", t);
                            }

                        // add the player into the hashmap which represents his position                        
                            String pos = (String)homeTeam.get(i).entrySet().iterator().next().getValue().get("position");

                            ////////////// Attacking players///////////
                            if(listAttackingPositions.contains(pos))
                                    if(attackingPlayers.containsKey("H"))
                                            attackingPlayers.get("H").putAll(t);
                                    else
                                            attackingPlayers.put("H", t);

                            ////////// Midfield players ///////////////
                            if(listMidfieldPositions.contains(pos))

                                    if(midfieldPlayers.containsKey("H"))
                                            midfieldPlayers.get("H").putAll(t);
                                    else
                                            midfieldPlayers.put("H", t);


                            /////////// Defending players ///////////////////
                            if(listDefendingPositions.contains(pos))
                                    if(defendingPlayers.containsKey("H"))
                                            defendingPlayers.get("H").putAll(t);
                                    else
                                            defendingPlayers.put("H", t);
                    }

因此 - 在行之前: fieldPlayers.get(&#34; H&#34;)。putAll(t); - defendingPlayers包含defendingPlayer。只要 fieldPlayers.get(&#34; H&#34;)。putAll(t); 就会执行。 midfieldPlayers 为空, fieldplayers 现在也包含了应该如此的midfieldPlayer。但 卫冕玩家 现在包含 防守球员 中场球员 。 - 这很奇怪,因为那段时间没有执行代码而且中场球员不应该在那里。

我希望有人可以帮助我 - 如果我仍然可以使用此设置,那将非常实用。所以我可以通过循环中场球员或场上球员来操纵我的球员......

亲切的问候

1 个答案:

答案 0 :(得分:2)

您最终可以在多个地方共享相同的哈希映射:当其中一个地图没有“H”条目时,您可以为该密钥设置t。因此,当您下次向该地图添加项目时,添加的项目将显示在 all 之前插入t的地图中。换句话说,错误发生是因为在某些之前的迭代中将地图添加到多个位置。

最安全的是,当“H”键不存在时,创建新的HashMap,而不是使用t