検索

キーワード


【Java】Iterator とは?List や Set との関係や Map での使い方

  • 公開日:2020-07-31 18:20:50
  • 最終更新日:2021-01-25 18:16:21
【Java】Iterator とは?List や Set との関係や Map での使い方

こんにちは、駆け出しプログラマーの若江です!

ここでは初学者として学習を終えた私が、アウトプットの意味も込めてコレクションのIteratorについてご紹介させていただきます。

できる限り初学者が理解しやすい内容として紹介させていただくので、参考となれば幸いです!


関連記事リンク:コレクションの概要 / 拡張for文の使い方 / コレクション (List) の使い方 / コレクション(Set)の使い方 / コレクション(Queue, DeQue)の使い方 / コレクション(Map)の使い方

コレクション :Iterator インターフェース

Iteratorインターフェースはコレクションに属したインターフェースです。

Iterator は List, Set, Map のようなコレクションに対してデータを取り出す役割をします。

ここでは格納したデータを取り出す Iterator の機能や書き方について紹介させていただきます。


Iterable が持つiteratorメソッド

Iterator はコレクションの中のデータを取り出す繰り返し処理を行います。

Collectionインターフェースは Iterable インターフェースを継承しているため、

Collectionを継承した Listインターフェース、Setインターフェースでも Iterator が利用できるようになっています。

 ・Iterableインターフェース ➡継承➡ Collectionインターフェース ➡継承➡ List & Setインターフェース

このように継承元に Iterable があり、Iterable が持つ iteratorメソッドをCollecionが継承しているため、

ほぼ共通の書き方で List, Set, Map でも Iterator が使えるようになっています。


余談

実際は Mapインターフェースは Collectinインターフェースを継承しておらず、独立したインターフェースです。

ただし Mapインターフェースのメソッドが、Iterable を継承した Collection や Set を利用しているため、

Map でも Iterator が使えるようになっています。

Collection や Set を介して Iterator 機能を借りているので、Map 自身に iterator メソッド がないことに注意してください。


Iterator の代表的なメソッドと使い方

Iterator を利用するにあたって押さえておくべき2つのメソッドを紹介します。

hasNext:配列からデータを繰り返し取り出す処理をする際に、次のデータが存在すれば true を返します。

   next   :繰り返し処理の際に、次のデータを取り出します。


基本的に上記2つのメソッドはセットで利用します。

List を使って実際の使用例をサンプルコードで見てみましょう。

import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
List<String> list = new ArrayList<String>();
// リストに a,b,c を追加
list.add("a");
list.add("b");
list.add("c");

// Listの iteratorメソッドを使ってリスト内の要素を反復するイテレータを取得、Iterator の変数に代入
Iterator<String> iterator = list.iterator();

// while文の繰り返し条件に Iterator の hasNextメソッドを利用
while(iterator.hasNext()) {
	String str = iterator.next(); // Iterator の nextメソッドで次のデータを取得
	System.out.println(str); // 結果:a b c を表示
}

処理の流れは以下のようなイメージです。

①String型の arrayList( list ) に a, b, c を格納。

②Listの iteratorメソッドを使ってリスト内の要素を反復するイテレータを取得、Iterator の変数に代入。

 Iteratorインターフェースのメソッドが使えるようになる。

③while文で iterator に次のデータあれば( = hasNext )繰り返し処理を実行すると指示。

④iterator に含まれている次のデータを1つ取得( = next )して String型の変数( str )へ代入。

⑤Systemout.println で変数( str )の中身を繰り返し表示


Map での Iterator の使い方

List や Set は iteratorメソッドを呼ぶことで Iterator が利用できるため、2つの基本的な書き方は同じです。

しかし Map は紹介した通り iteratorメソッドがないため、若干 List や Set と書き方が異なります。

Map では Setインターフェース、Collectionインターフェースを介して Iterator の機能を利用します。

Setインターフェース、Collectionインターフェースを取得できる Map のメソッドは以下3つです。

keySetメソッド / valuesメソッド / entrySetメソッド

先ほど紹介したListの例に合わせた形でサンプルコードを見てみましょう。

今回は Map のキーを取得する「keySet」を使います。

import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
Map<Integer, String> map = new HashMap<Integer, String>();
// マップに 1=a, 2=b, 3=c を入れる
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");

// Integer型の Iterator(iterator) に Map のキーを代入
Iterator<Integer> iterator = map.keySet().iterator();

// while文の条件に hasNext を設定
while(iterator.hasNext()) {
	Integer num = iterator.next(); // データの取り出し
	System.out.println(num); // 結果:1 2 3 を表示
}


基本的に List も Set も同じ書き方をしますが、Map で注意するべき点は中段あたりのコードです。

Iterator<Integer> iterator = map.keySet().iterator();

Map のキーのデータを変数 iterator へ代入している部分ですが、

Map のメソッド「keySet」は Setインターフェースの機能を借りています。

keySet の後ろにある「.iterator()」は Setインターフェースのメソッドです。

Map は iteratorメソッドがないので少し複雑化していますが、

上記のような動作をしていることを覚えておきましょう。



まとめ

Iterator はコレクションの中のデータを取り出す繰り返し処理の役割をします。

同じような機能を持つものにfor文がありますが、for文の裏側でも実は Iterator が動いています。

繰り返し処理の基本を Iterator が担うので使い方を覚えておきましょう。


関連記事リンク

コレクションの概要 / 拡張for文の紹介 / コレクション (List) の紹介 / コレクション(Set)の紹介 / コレクション(Queue, DeQue)の紹介 / コレクション(Map)の紹介



【著者】

若江

30代で異業種となるIT業界へ転職した駆け出しのプログラマです。これまで主に Java や Ruby、HTML/CSS を使って学習を目的としたショップサイトや掲示板サイトの作成を行いました。プログラマとしての経験が浅いからこそ、未経験者の目線に近い形で基礎の紹介をしていきたいと思います。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様