1. キーと値のペアのセット。

キーと値のペアのセット

Java では、(大まかに言えば) もう 1 つの興味深いコレクションが ですMap。このデータ構造は辞書と呼ばれることもあります。

これはSetコレクションに似ていますが、要素のセットではなく、要素の「ペア」のセットを保存します。 の各ペアは、Map「キー」と「値」の 2 つの要素で構成されます。

従業員の名前とその給与、または同僚の名前とその年齢をプログラムに保存したいとします。次に、次のようなテーブルが必要になります。

名前
エロン 21
ジェフ 22
明細書 48
ウォーレン ?

各行にはいくつかの値が含まれます。名前をペアのキーと呼び、年齢をペアのと呼びます。

これらのペアのセット全体がマップ( Map) です。

ペアのキーには、 以外の任意のキーを指定できますnull。キーは一意である必要があります。1つのマップに 2 つの同一のキーを含めることはできません。


2.HashMapクラス

このHashMapクラスは、最も人気のある種類のMapコレクションです。一方で、これは HashSet に非常に似ており、そのすべてのメソッドを備えています。一方、これはArrayList単語 (またはその他のもの) をインデックスとして使用できるリスト ( ) に似ています。

HashMap次のようなステートメントを使用してを作成できます。

HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();

ここで、KeyTypeは保存されているペアのキーのタイプ、 はコレクションValueTypeに保存されているペアの値のタイプですHashMap

クラスHashMapには次のようなメソッドがあります。

方法 説明
void put(KeyType key, ValueType value)
( key, value) ペアをコレクションに追加します
ValueType get(KeyType key)
キーに関連付けられた値を返します。
boolean containsKey(KeyType key)
キーがコレクションに存在するかどうかを確認します
boolean containsValue(ValueType value)
コレクション内の値の存在を確認します。
ValueType remove(KeyType key)
コレクションから要素を削除します
void clear()
コレクションをクリアし、すべての要素を削除します
int size()
コレクション内のキーと値のペアの数を返します。
Set<KeyType> keySet()
コレクション内のキーのセットを返します。
Collection<ValueType> values()
コレクションの要素を含むセットを返します。
Set<Map.Entry<KeyType, ValueType>> entrySet()
コレクション内のSetすべてのペア ( ) のセット ( ) を返します。Map.Entry

に要素を追加するHashMap

要素は、 メソッドを使用してペアとしてマップに追加されますput()。キーは最初の引数として渡され、値は 2 番目の引数として渡されます。

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

キーと値のペアを追加するときに、キーがコレクションにすでに存在している場合は、古い値が新しい値に置き換えられます。

この動作により、HashMapインデックスが数値ではなく単語 ( ) である配列またはリストのようなものが作成されますString

重要:

ほとんどすべての型を KeyType または ValueType にすることができます。KeyType にはいくつかの小さな追加要件があります。それらについては、Java コレクション クエストでコレクションを詳しく調べるときに学習します。



3. a のサブセットHashMap: キーのセット

HashMapa 内のすべてのエントリを画面上に表示したいとします。どうやってこれを行うのでしょうか?これを行うには、.内のすべてのエントリを調べる方法を知る必要がありますHashMap。これはいくつかの方法で実行できます。

最も簡単な方法はキーをループすることです

HashMapエントリには連続した番号が付けられていないため、ここではカウンターを使用したループは機能しません。ただし、 メソッドを使用してキーのセットを取得できますkeySet()。セットを反復処理する方法はすでに知っています。

コード 説明
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}






のキーをループして、map

キーに関連付けられた値を取得します

このkeySet()メソッドはキーのセットを返します。このセットは 2 つの方法で使用できます。

コンパクトな表記法 長い表記
for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}
Set<String> keys = map.keySet();

for (String key: keys)
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}


4. キーと値のペアのループ

より複雑な方法もあります。すでに学習したように、 a をキーと値のペアのセットMapに変換し、そのセットの要素をループすることができます。

コレクションHashMapには、キーと値のペアを格納するヘルパー クラスがあります。おおよそ次のようになります。

class Entry<KeyType, ValueType>
{
   private KeyType key;
   private ValueType value;

   public KeyType getKey()
   {
      return this.key;
   }

   public ValueType getValue()
   {
      return this.value;
   }
}

entrySet()オブジェクトに対してメソッドを呼び出した結果は次のようになります。HashMap<KeyType, ValueType>Set<Entry<KeyType, ValueType>>

Set<Entry<KeyType, ValueType>> name = map.entrySet();

ここには型パラメータを持つジェネリックSetクラスがあり、これは 2 つの型パラメータを持つジェネリック型 ( Entry) です。

初心者はこれについて非常に混乱しやすいです。しかし、一度理解すれば、次のようなコードを書くことができます。

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> pair: entries)
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

つまり、このコードは少し簡略化できます。

まず、別の変数の作成をスキップし、代わりにループ内でメソッドを直接entries呼び出すことができます。entrySet()for

for(Map.Entry<String, Integer> pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

2 番目に、最近導入された演算子を使用して、キーと値のペアvarの型を自動的に推測できます。

for(var pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

悪くないですよね?



ArrayList5.との比較HashMap

は、文字列 (または他の型) をインデックス (キー) として使用できるようにするHashMapによく似ていますArrayList

Integerのキーに を使用するとHashMap、さらに に似たものになりますArrayList。比較してみましょう:

ArrayList<String> を使用したコード HashMap<Integer, String> を使用したコード
ArrayList<String> list = new ArrayList<String>();

list.add("Greetings");
list.add("Hello");

String s = list.get(0);
list.set(0, s + "!");

for (String item: list)
{
   System.out.println(item);
}
HashMap<Integer, String> map = new HashMap<Integer, String>();

map.put(0, "Greetings");
map.put(1, "Hello");

String s = map.get(0);
map.put(0, s + "!");

for (String item: map.values())
{
   System.out.println(item);
}