web-dev-qa-db-ja.com

Java:HashMapのリストを作成する

地図のリストを作ってみました。次のコードでは、私は得ることを期待しています

[{start=1,text=ye}, {start=2,text=no}]

しかし、私は得た

[{start=2,text=no}, {start=2,text=no}]

最初のマップを上書きしないようにするにはどうすればよいですか?これが私のコードです:

HashMap mMap = new HashMap();
ArrayList list = new ArrayList();
list.add(new HashMap());
mMap.put("start",1);
mMap.put("text","yes");
list.add(mMap); 
mMap.put("start",2);
mMap.put("text","no");
list.add(mMap); 
System.out.println("Final result: " + list );

ありがとう!

==========================

Java=手続き言語のバックグラウンド(SAS)の出身)の学習者として、ArrayList、LinkedList、Map、LinkedMapなどの学習と実験にかなりの時間を費やしました---なぜ私は限られた知識でその理由を理解していませんが、今、これらの次の回答はすべて素晴らしいです!彼らは、少なくとも私にとって、Javaの非常に重要なデータ構造を説明しました。

皆さん、ありがとうございました!!!!

11
john

既存のエントリを再利用するのではなく、エントリごとに新しいHashMapを作成する必要があります。これはうまくいくでしょう:

_HashMap mMap = new HashMap();
mMap.put("start",1);
mMap.put("text","yes");
list.add(mMap); 
mMap = new HashMap(); // create a new one!
mMap.put("start",2);
mMap.put("text","no");
list.add(mMap); 
_

また、list.add(new HashMap());を削除することもできます。これにより、入力されていない空のマップがリストに追加されます。

36
Luke Hutteman

言及する価値があるかもしれませんが、使用する要素のタイプをListで定義する必要があります。HashMapでは、混合しているため不可能ですIntegersおよびStrings

もう1つのことは、型としてListインターフェイスを使用する必要があるため、将来的に実装(ArrayListなど)を変更できるようになります。

ここに修正されたコード:

Map mMap = new HashMap();
List<Map> list = new ArrayList();
6
Prine

はい、このコードの一部からマップをハッシュします

list.add(new HashMap());

参照されることはありません。したがって、最終的には3つの項目のリストが表示されますが、そのうち2つは同一です。

1
Denis Kniazhev

このマップへの参照を保存することはありません:

list.add(new HashMap());
0
Peter Knego

リストに3つ追加します。最初の追加は新しいマップインスタンスへの追加です。値を設定することはありません。 2番目の追加では、nMapへの参照を渡します。 3番目のaddでは、同じ参照を渡します。したがって、マップには3つの参照があります。1つは値を追加したことのないマップへの参照、次の2つは同じマップへの参照です。これが、同じ出力が得られる理由です。

0
hvgotcodes

同じキー名をマップに配置すると、値は同じキーに上書きされます。私たちが持っていると仮定します

mMap.put("start",1);
mMap.put("start",2);
mMap.put("start",3);
mMap.put("start",4);

key( "start")が同じであるため、長さが4のマップは作成されず、同じキーの値がオーバーライドされます。そのため、「開始」キーに対して1つの値(4)のみを取得します。これを回避するには、ハッシュマップのキーの名前を変更する必要がありますが、scenaroでは、arralistを維持しているときに、キーと値を保存するハッシュマップの別のインスタンスが必要です。

0
M.ArslanKhan