【发布时间】:2017-11-27 11:30:00
【问题描述】:
我在我的程序中遇到了一个 Hashmap 的问题,它覆盖了以前的 Hashmap 条目的值,这两个条目具有不同的键。
public void drawTheNumbers() {
final int NO_WIN = 0;
int playerOneTicketWinning = 0;
Tuple numberTransporter = new Tuple (0,0);
for(Journal entry : theJournal) {
playerOneTicketWinning = entry.getWinning();
if (winningsPerPlayer.containsKey(entry.getPerson())) {
numberTransporter.playerTotalWinnings = numberTransporter.playerTotalWinnings + playerOneTicketWinning;
numberTransporter.playerSimilarities = numberTransporter.playerSimilarities + entry.getSimilarities();
winningsPerPlayer.put(entry.getPerson(), numberTransporter );
}else {
numberTransporter.playerTotalWinnings = playerOneTicketWinning;
numberTransporter.playerSimilarities = entry.getSimilarities();
winningsPerPlayer.put(entry.getPerson(), numberTransporter);
}
}
for (Map.Entry<String, Tuple> player: winningsPerPlayer.entrySet()) {
int temp1 = numberTransporter.getplayerTotalWinnings();
int temp2 = NO_WIN;
if (temp1 == temp2) {
noWinMessage (player.getKey());
}else {
playerWinningsMessage(player.getKey(), numberTransporter);
}
}
}
当这个循环第二次运行时,它将覆盖上面方法中的 playerTotalWinnings 和 playerSimilarities 的值,但也会覆盖由winningsPerPlayer.put 创建的Hashmap 中的先前条目
key是用户在运行程序时输入的播放器名称。多个用户可以在同一个会话中运行该程序。
【问题讨论】:
-
如果每个会话由多个用户运行,您应该考虑添加一些日志记录,以便查看替换了哪些键值。
-
类似问题请见stackoverflow.com/questions/16522542/…。您需要从地图中检索给定键的元组,如果丢失则插入新的元组。
-
@JoopEggen entry.getPerson() 与该问题无关。它是 numberTransporter,它被共享并被结果覆盖。
-
@ArturBiesiadowski 谢谢,直到最后才读到。