问题:我是玩家。例如防守球员和中场球员。首先使用防守球员。他将被放入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。但 卫冕玩家 现在包含 防守球员 和 中场球员 。 - 这很奇怪,因为那段时间没有执行代码而且中场球员不应该在那里。
我希望有人可以帮助我 - 如果我仍然可以使用此设置,那将非常实用。所以我可以通过循环中场球员或场上球员来操纵我的球员......
亲切的问候
答案 0 :(得分:2)
您最终可以在多个地方共享相同的哈希映射:当其中一个地图没有“H”条目时,您可以为该密钥设置t
。因此,当您下次向该地图添加项目时,添加的项目将显示在 all 之前插入t
的地图中。换句话说,错误发生是因为在某些之前的迭代中将地图添加到多个位置。
最安全的是,当“H”键不存在时,创建新的HashMap
,而不是使用t
。