CodeGym /Java Blog /ランダム /Java でマップを反復する方法
John Squirrels
レベル 41
San Francisco

Java でマップを反復する方法

ランダム グループに公開済み
この投稿では、Java でマップを反復するさまざまな方法を学びます。その一般的な方法とその使用方法を例を挙げて説明します。始める前に、Java のインターフェースマップについて理解していることを前提としています。ただし、ここで簡単にまとめておきます。

Java のマップとは何ですか?

これには色々な解釈がありますが、簡単に言うとこんな感じです。
「マップは Java のインターフェイスであり、キーと値のペアの形式でデータを保存するために使用されます。」
地図は何に使われるのでしょう? それともいつ必要になるのでしょうか?現実には、データをキーと値のペアで保存する必要がある状況が数多くあります。たとえば、辞書内の 1 つの文字に対応するすべての単語を Java のマップ形式で保存できます。
K カイト、キング、コリア、ナイト、...など
L 溶岩、生命、光、愛、レバノン、...など
さらに、これをよりよく理解するために次の例を見てください。
価値
ファミリーID 家族のメンバー
クラス名 学生証
エリア名 郵便番号
エリアブロック 住居番号

なぜマップを反復処理する必要があるのでしょうか?

データにアクセス、変更、または削除するには、マップを横断または反復する必要があります。いくつかのオプションを検討してみましょう。

Java でマップを反復する一般的な方法にはどのようなものがありますか?

ただし、マップを横断する方法はたくさんあります。ただし、最も効率的で簡単な方法に焦点を当てます。
  1. ForEach ループ メソッド
  2. Iterators メソッド
両方のメソッドの実装については以下をご覧ください。

Foreach ループ メソッドの使用


import java.util.Map;
import java.util.HashMap;

public class ForEachDemo {

	public static void main(String[] args) {

		Map<String, String> businessDays = new HashMap<String, String>();

		// store business days i-e; key/value pairs in the Map
		businessDays.put("1", "Monday");
		businessDays.put("2", "Tuesday");
		businessDays.put("3", "Wednesday");
		businessDays.put("4", "Thursday");
		businessDays.put("5", "Friday");

		// Iterating over the Map.entrySet() using map.forEach
		for (Map.Entry<String, String> entry : businessDays.entrySet()) 
		{
			System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue()); 
		}
	}
}

出力

キー = 1、値 = 月曜日 キー = 2、値 = 火曜日 キー = 3、値 = 水曜日 キー = 4、値 = 木曜日 キー = 5、値 = 金曜日

説明

この例では、foreach ループを使用してマップを反復処理しました。for-each ループを使用すると、マップ内のデータの自動「ビュー」をキーと値のペアの形式で提供するentrySet()を取得します。各entrySetにはキーと対応する値が含まれています。要件に応じてMap.Entry<key, value>のすべてのメソッドを使用できる場所。ここでは、コンソールにデータを表示するためにgetKey()getValue()のみを使用しました。演習として、この概念の指揮を強化するための残りの方法を検討してください。

Iterators メソッドの使用


import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class MapIterator {

	public static void main(String[] args) {

		Map<String, String> monthsInAYear = new HashMap<String, String>();

		// store business days i-e; key/value pairs in the Map
		monthsInAYear.put("1", "January");
		monthsInAYear.put("2", "February");
		monthsInAYear.put("3", "March");
		monthsInAYear.put("4", "April");
		monthsInAYear.put("5", "May");
		monthsInAYear.put("6", "June");
		monthsInAYear.put("7", "July");
		monthsInAYear.put("8", "August");
		monthsInAYear.put("9", "September");
		monthsInAYear.put("10", "October");
		monthsInAYear.put("11", "November");
		monthsInAYear.put("12", "December");

		// iterate map / traverse the map using using iterator
		Iterator<Map.Entry<String, String>> iterator = monthsInAYear.entrySet().iterator();

		while (iterator.hasNext()) 
		{
			// check if next entry exists in the map
			Map.Entry<String, String> entry = iterator.next(); 
			System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue());

		}
	}
}

出力

キー = 11、値 = 11 月キー = 1、値 = 1 月キー = 12、値 = 12 月キー = 2、値 = 2 月キー = 3、値 = 3 月キー = 4、値 = 4 月キー = 5、値 = 5 月キー= 6、値 = 6 月 キー = 7、値 = 7 月 キー = 8、値 = 8 月 キー = 9、値 = 9 月 キー = 10、値 = 10 月

説明

この例では、マップ上を走査/反復するための明示的なイテレーターを作成します。まず、イテレータ クラスをインポートし、次に、entrySet のイテレータを取得する必要があります。次に、マップ上に存在する次のエンティティをチェックし続けながら、マップを横断します。さあ!このようにして、トラバースは完了しました。

Foreach ループはイテレータ メソッドよりも優れていますか?

機能する限り、マップの走査にどの方法を使用しても問題ありません。パフォーマンスの点では、for-each ループとイテレータの時間計算量は同じです。したがって、どれが他より優れているということはなく、何をいつ使用する必要があるかによって異なります。

2 つの方法の違いは何ですか?

for-each ループでは、マップ内のデータを更新/変更することはできません。逆に、イテレータを使用するとデータを簡単に変更できます。イテレータ クラスを使用すると、マップ内のデータを編集/削除するための実装が提供されるため、作業が容易になります。逆に、for-each ループを使用してマップ データを編集/削除しようとすると、 ConcurrentModificationException がスローされます。その理由は、for-each ループが暗黙的に反復子を作成し、それがユーザーに公開されないためです。したがって、データを変更または削除するアクセス権はありません。

どの走査方法をいつ使用するか?

マップを反復処理するために for-each を使用するかイテレーターを使用するかわからない場合は、次の提案を参考にしてください。
  • マップを変更する必要がある場合は、イテレータを使用します。
  • ネストされたループがある場合は、for-eachループを使用します(複雑さを避けるため)。

結論

この投稿を終えるまでに、Java でマップを反復処理する方法を学習していただければ幸いです。これらを実践し、他のトラバース方法も試してみることをお勧めします。行き詰まった場合は、いつでもお気軽に戻ったり、質問を投稿してください。それまで、楽しく学んでください!
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION