-1

这是播放器类

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 个值的空值。

这意味着 currentPosition=null 用于键值 0 的 hashmap。

帮我..

4

6 回答 6

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的 ' 是相等的。

以下问题可能对您有用:了解 HashMap 中 equals 和 hashCode 的工作原理

示例代码:

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;
}
}
于 2012-09-06T12:10:58.817 回答
3

首先,我会使用一个 ArrayList 从 0 访问索引。

在您的情况下,您遇到的问题是 Player 没有实现 equals 和 hashCode 所以这意味着new Player(0)new Player(0)是两个不同的对象,它们恰好具有相同的值。

于 2012-09-06T12:10:20.457 回答
2

问题是你的Player类的两个不同实例不会比较相等。

Player player1 = new Player(0);
Player player2 = new Player(0);
System.out.println(player1.equals(player2));

但我认为哈希图在这里不是一个合适的结构。解决方案是将玩家存储在一个数组中。

for (int i = 0; i < numberOfPlayers; i++) {
    Player player = players[i];
    // etc...
}
于 2012-09-06T12:10:01.343 回答
2

根本原因是Player没有实现hashCode和equals。因此,当 hashMapForPositionOfPlayer.get(player) 搜索地图时,它会查找具有另一个 hashCode 的对象,然后是放入的对象。

将以下代码添加到 Player,它应该可以解决问题

@Override public int hashCode() { return 0; }

@Override
public boolean equals(Object obj) {
    Player other = (Player) obj;
    return this.playerId == other.playerId;
}
于 2012-09-06T12:15:10.543 回答
1

您在 的构造函数中创建了一系列玩家Game并将它们放入您的 中HasMap,但是当您在play方法中进行查找时,您会创建新玩家并尝试将它们用作查找。

这是两个不同的引用,因此HashMap找不到播放器(您刚刚创建)并返回null

创建和填充HasMap

hashMapForPositionOfPlayer.put(new Player(i), new Position(0));

创建和查找...Null

Player player = new Player(i); // this reference does not exist in the HasMap
currentPosition = hashMapForPositionOfPlayer.get(player);
于 2012-09-06T12:11:21.547 回答
1

或者忘记使用 Player 作为密钥,而是使用玩家 ID。

Map<Integer, Position> 

需要使用玩家 ID 查找位置。

于 2012-09-06T12:15:03.097 回答