这是玩家类
package day6;
public class Player {
int playerId;
public Player(int playerId) {
super();
this.playerId = playerId;
}
public int getPlayerId() {
return playerId;
}
}
这是职位类
package day6;
public class Position {
private int positionNumber = 0;
public Position(int positionNumber) throws Exception {
super();
this.positionNumber = positionNumber;
}
public int getPositionNumber() {
return positionNumber;
}
}
这是游戏类
package day6;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
public class Game {
private int numberOfPlayers;
HashMap<Player, Position> hashMapForPositionOfPlayer = new HashMap<Player, Position>(numberOfPlayers);
@SuppressWarnings("unchecked")
public Game(int numberOfPlayers) throws Exception {
super();
this.numberOfPlayers = numberOfPlayers;
for (int i = 0; i <numberOfPlayers; i++) {
hashMapForPositionOfPlayer.put(new Player(i), new Position(0));
}
}
public void play() throws Exception {
Position currentPosition;
for (int i = 0; i < numberOfPlayers; i++) {
Player player = new Player(i);
currentPosition = hashMapForPositionOfPlayer.get(player);
int value = currentPosition.getPositionNumber();
}
}
}
我试图运行程序Game类和game.play(),但是它显示了hashmap的第0个值的空值。
对于键值0的hashmap,它表示currentPosition = null。
帮帮我......
答案 0 :(得分:4)
由于您使用Player
个实例作为HashMap
的密钥,因此应始终如一地实施hashCode()
和equals()
,以便有两个Player
实例当他们的playerId
相等时,他们被认为代表同一个玩家。
如果没有正确实施equals()
,以下代码段将返回false:
Player p1 = new Player(1);
Player p2 = new Player(1);
return p1.equals(p2);
此外,鉴于您选择的Map
实施的性质HashMap
,Map
中现有密钥的检查将与其hashCode
相关联,因此,有必要实施hashCode
以反映两个Player
实例在playerId
的情况下是相等的。
以下问题可能对您有用:Understanding the workings of equals and hashCode in a HashMap。
示例代码:
package day6;
public class Player {
int playerId;
public Player(int playerId) {
super();
this.playerId = playerId;
}
public int getPlayerId() {
return playerId;
}
public int hashCode(){
return playerId.hashCode();
}
public boolean equals(Object o){
if (o instanceOf Player) {
return playerId.equals( ((Player)o).getPlayerId());
}
return false;
}
}
答案 1 :(得分:3)
首先,我将使用ArrayList从0访问索引。
在你的情况下,你遇到的问题是Player没有实现equals和hashCode,这意味着new Player(0)
和new Player(0)
是两个不同的对象碰巧有一个相同的值
答案 2 :(得分:2)
问题在于,Player
类的两个不同实例不会相等。
Player player1 = new Player(0);
Player player2 = new Player(0);
System.out.println(player1.equals(player2));
但我认为这里的hashmap不是一个合适的结构。解决方案是将玩家存储在阵列中。
for (int i = 0; i < numberOfPlayers; i++) {
Player player = players[i];
// etc...
}
答案 3 :(得分:2)
根本原因是Player没有实现hashCode和equals。 因此,当hashMapForPositionOfPlayer.get(播放器)搜索地图时,它将查找具有另一个hashCode的对象,然后查找放入的对象。
将以下代码添加到Player,它应该可以解决问题
@覆盖 public int hashCode(){ 返回0; }
@Override
public boolean equals(Object obj) {
Player other = (Player) obj;
return this.playerId == other.playerId;
}
答案 4 :(得分:1)
您在Game
的构造函数中创建了一系列玩家,并将它们放在HasMap
中,但当您使用play
方法查找时,您可以创建新的玩家和尝试使用那些作为查找。
这是两个不同的引用,因此HashMap
找不到播放器(您刚刚创建)并返回null
创建&amp;填充HasMap
hashMapForPositionOfPlayer.put(new Player(i), new Position(0));
创建&amp;找到... Null
Player player = new Player(i); // this reference does not exist in the HasMap
currentPosition = hashMapForPositionOfPlayer.get(player);
答案 5 :(得分:1)
或者忘记使用Player作为键并改用玩家ID。
Map<Integer, Position>
需要使用玩家ID查找位置。