-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()を実行しようとしましたが、ハッシュマップの0番目の値に対してnull値が表示されています。

これは、キー値0のハッシュマップに対してcurrentPosition=nullを意味します。

助けて..

4

6 に答える 6

4

Playerのキーとしてインスタンスを使用しているため、2つのインスタンスが等しい場合に、2つのインスタンスが同じプレーヤーを表すと見なされるように、一貫してHashMap実装する必要があります。hashCode()equals()PlayerplayerId

適切に実装しequals()ないと、次のスニペットはfalseを返します。

Player p1 = new Player(1);
Player p2 = new Player(1);
return p1.equals(p2);

Mapまた、選択した実装の性質を考えると、のHashMap既存のキーのチェックはMapそれらに関連付けられるため、2つのインスタンスが等しい場合は2つのインスタンスが等しいことを反映するようにhashCode実装する必要もあります。hashCodePlayerplayerId

次の質問が役立つ場合があります。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

まず、0アクセスからインデックスを作成するためにArrayListを使用します。

あなたの場合、あなたが抱えている問題は、PlayerがequalsとhashCodeを実装していないことです。つまり、new Player(0)new Player(0)は、たまたま同じ値を持つ2つの異なるオブジェクトです。

于 2012-09-06T12:10:20.457 に答える
2

問題は、クラスの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新しいプレーヤーを作成し、それらをルックアップとして使用してみます。

これらは2つの異なる参照であるため、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

または、プレーヤーをキーとして使用することを忘れて、代わりにプレーヤーIDを使用してください。

Map<Integer, Position> 

プレーヤーIDを使用して位置を検索する必要があります。

于 2012-09-06T12:15:03.097 に答える