2017-11-27 5 views
0

내 프로그램에서 해시 맵 문제가 발생하여 이전 해시 맵 항목의 값을 덮어 쓰면 다른 키가있는 두 항목이 삭제됩니다. 그것이 상기 방법 playerTotalWinnings 및 playerSimilarities의 값을 덮어 주위이 루프가 아니라 다른 키에도 불구하고 해시 맵 항목이 이전 항목을 덮어 씁니다.

키 winningsPerPlayer.put

의해 생성 된 해시 맵에서 이전 항목으로, 두 번째 실행

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); 
     } 
    } 
} 

는 프로그램을 실행할 때 사용자가 입력 한 플레이어의 이름입니다. 여러 사용자가 동일한 세션 내에서 프로그램을 실행할 수 있습니다.

+2

세션 당 여러 사용자가 실행하는 경우 어떤 키 값이 대체되는지 확인하려면 일부 로깅을 추가하는 것이 좋습니다. –

+0

비슷한 문제에 대해 https://stackoverflow.com/questions/16522542/hashmap-values-of-existing-keys-getting-overwritten-upon-using-put-to-store-a-ne을 참조하십시오. 지정된 키에 대해 맵에서 Tuple을 검색하고 누락 된 경우 새 키를 삽입해야합니다. –

+0

@JoopEggen entry.getPerson()은이 문제와 아무 관련이 없습니다. 결과로 공유되고 겹쳐 쓰여지는 것은 numberTransporter입니다. –

답변

1

키가 다를 수 있습니다. 그러나 값은 -_- °가 아닙니다.

루프 앞에서 만든 튜플을 계속 수정하는 대신 루프 내에 새 튜플을 만들어야합니다.

일반적으로 튜플과 같은 것은 생성 후에 수정 될 필요가 없으며 포함될 두 값으로 만들어지며 변경되지 않아야합니다. 따라서 최종 값으로 변경할 수 없도록 만들어야합니다. 그렇게 바보 같은 실수를 피하십시오.