1

JAVA では、"Player" オブジェクトをキーとして、"ArrayList" を値として持つ HashMap があります。各プレイヤーの対戦相手を保存するために使用されます。ハッシュマップを指す変数は playerOpponents と呼ばれます。

今、あるプレイヤーに対戦相手を追加したいと思います。方法 1 のように編集後にリストをマップに入れる必要があるのか​​、方法 2 のように必要でないのか。

方法1:

private void addOpponent(Player p, Player opponent)
{
    ArrayList<Player> allOpponents = playerOpponents.get(p);
    allOpponents.add(opponent);
    playerOpponents.put(p,allOpponents);
}

方法 2:

private void addOpponent(Player p, Player opponent)
{
    ArrayList<Player> allOpponents = playerOpponents.get(p);
    allOpponents.add(opponent);
}
4

7 に答える 7

3

毎回リスト参照を入れる必要はありません。nullチェックを入れるだけ。

private void addOpponent(Player p, Player opponent){
    List<Player> allOpponents = playerOpponents.get(p); 
    if(playerOpponents.get(p)==null){
         allOpponents = new ArrayList<>();
         allOpponents.add(opponent);
         playerOpponents.put(p,allOpponents);
    }else
       allOpponents.add(opponent);
}
于 2013-04-10T17:47:12.427 に答える
1

番号。HashMapすでにリストがあるのでget、参照するだけremoveなので、再度追加する必要はありません。要素を既存のリストに追加するだけです。それでおしまい。

于 2013-04-10T17:44:05.833 に答える
1

いいえHashMaps、他のすべてのコレクション ストアObject参照と同様です。のオブジェクトに加えた変更は、同じ Objectであるため、返されるMapにすぐに反映されます。ObjectHashMap#get

于 2013-04-10T17:44:08.437 に答える
1

オブジェクトを再配置する必要はありません。あなたのステートメントが行っているのは、のコピーではgetなく、への参照を取得することです。ArrayListArrayList

別の例として、次のようにしたとします。

ArrayList a = playerOpponents.get(p);
ArrayList b = playerOpponents.get(p);

に加えられた変更は にa反映されb、その逆も同様です。あなたの場合、aはメソッドで から取得された参照であり、はArrayListの参照です。1 つの参照への変更は、他の参照に反映されます。HashMapgetbArrayListHashMap

于 2013-04-10T17:45:58.420 に答える
0

キー値マップの VALUE を変更するだけなので、再配置する必要はありません。

ただし、注意すべき微妙な落とし穴があります。KEY、つまり Player インスタンスを、その equals() メソッドまたは hashCode() メソッドに影響を与える方法で変更すると、マップが非常に混乱する可能性があります。デフォルトの equals() および hashCode() 実装を使用している場合、プレーヤーのフィールドを変更すると、マップが台無しになります。

この後者のシナリオでは、変更前に削除し、変更後に再配置して、新しいハッシュの場所に適切にハッシュできるようにする必要があります。または、おそらくもっと簡単に、Player クラスの hashCode() および equals() メソッドをオーバーライドして、playerId などの Player の不変フィールドのみを考慮するだけです。その後、削除したり再配置したりせずに自由に使用できます (その不変フィールドが null にならない限り)。

于 2013-04-10T18:29:09.760 に答える
0

いいえ。Player p からの playerOpponent のマッピングによって参照される ArrayList には、他の関数呼び出しなしで「opponent」が含まれます。

于 2013-04-10T17:50:59.863 に答える
0

これを行う最も簡潔な方法は次のとおりです。

playerOpponents.get(p).add(opponent);
于 2013-04-10T17:45:21.577 に答える