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
には次のようなメソッドがあります。
方法 | 説明 |
---|---|
|
( key , value ) ペアをコレクションに追加します |
|
キーに関連付けられた値を返します。 |
|
キーがコレクションに存在するかどうかを確認します |
|
コレクション内の値の存在を確認します。 |
|
コレクションから要素を削除します |
|
コレクションをクリアし、すべての要素を削除します |
|
コレクション内のキーと値のペアの数を返します。 |
|
コレクション内のキーのセットを返します。 |
|
コレクションの要素を含むセットを返します。 |
|
コレクション内の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
: キーのセット
HashMap
a 内のすべてのエントリを画面上に表示したいとします。どうやってこれを行うのでしょうか?これを行うには、.内のすべてのエントリを調べる方法を知る必要がありますHashMap
。これはいくつかの方法で実行できます。
最も簡単な方法はキーをループすることです
HashMap
エントリには連続した番号が付けられていないため、ここではカウンターを使用したループは機能しません。ただし、 メソッドを使用してキーのセットを取得できますkeySet()
。セットを反復処理する方法はすでに知っています。
コード | 説明 |
---|---|
|
のキーをループして、 map キーに関連付けられた値を取得します |
このkeySet()
メソッドはキーのセットを返します。このセットは 2 つの方法で使用できます。
コンパクトな表記法 | 長い表記 |
---|---|
|
|
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);
}
悪くないですよね?
ArrayList
5.との比較HashMap
は、文字列 (または他の型) をインデックス (キー) として使用できるようにするHashMap
によく似ていますArrayList
。
Integer
のキーに を使用するとHashMap
、さらに に似たものになりますArrayList
。比較してみましょう:
ArrayList<String> を使用したコード | HashMap<Integer, String> を使用したコード |
---|---|
|
|
GO TO FULL VERSION