【问题标题】:Hashmap entry overwrites previous entry despite different key尽管键不同,哈希图条目仍会覆盖先前的条目
【发布时间】: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 谢谢,直到最后才读到。

标签: java hashmap tuples


【解决方案1】:

密钥可能不同。但值不是-_-°

您需要在循环内创建一个新元组,而不是不断修改您在循环之前创建的唯一一个。

通常,像元组这样的东西在创建后不需要修改,它应该使用它将包含的两个值创建,并且永远不会改变。所以它应该是不可变的,有最终值,这样你就可以避免那种愚蠢的错误。

【讨论】:

    猜你喜欢
    • 2013-02-21
    • 1970-01-01
    • 2016-04-25
    • 2021-07-19
    • 2011-09-09
    • 2021-04-12
    • 2020-11-27
    • 2016-03-19
    • 2016-07-13
    相关资源
    最近更新 更多