はじめに
皆さん。こんにちは!
DreamHanksの254cmです。
今回はIteratorクラスについて説明していきます。
Java記事のまとめはこちらです。
Iteratorとは?
Setのように値を繰り返して取り出す処理をしにくいデータストラクチャーのために
Collection FrameworkはIteratorというクラスを提供します。
イテレータはすべてのCollectionインターフェースの実装クラスに対する繰り返し処理を支援します。
しかし、MapはCollectionインターフェースと別のインターフェースなので、イテレータを利用した繰り返しができません。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class ItoratorSample { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); list.add("3"); list.add("4"); Iterator<String> iterator = list.listIterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); } } } |
上記のサンプルのようにIteratorを利用して繰り返すこともできますが、
現在にはJava5バージョンから追加された機能である「enhanced for」を利用して繰り返し出力することが推奨されるのでListの場合にはIteratorをあまり使いません。
出力結果
1 2 3 4 |
1 2 3 4 |
サンプル2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public class IteratorSample { public static void main(String[] args) { Set<String> set = new HashSet<String>(); set.add("apple"); set.add("orange"); set.add("mango"); set.add("banana"); Iterator<String> iterator = set.iterator(); while(iterator.hasNext()) { String result = iterator.next(); if(result.equals("mango")) { iterator.remove(); } System.out.println(result); } System.out.println(set); while(iterator.hasNext()) { iterator.next(); } } } |
上記のサンプルを見るとイテレータで要素を削除しています。
イテレータで削除された要素は現本のCollectionにも影響され、削除された要素の現本も削除されます。
そして、イテレータは1回目のwhileで最後に到達され、2回目のwhileでは次の値が存在されないので、2回目の繰り返しは実行されません。
出力結果
1 2 3 4 5 |
orange banana apple mango [orange, banana, apple] |
サンプル3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public class IteratorSample { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("a", "apple"); map.put("b", "banana"); map.put("c", "coconut"); map.put("d", "dried persimmon"); Set<Entry<String, String>> set = map.entrySet(); Iterator<Entry<String, String>> ite = set.iterator(); while(ite.hasNext()) { Entry<String, String> entry = ite.next(); if(entry.getValue().equals("coconut")) { ite.remove(); } System.out.println(entry); } System.out.println(map); System.out.println(set); } } |
上記のサンプルのようにマップの要素をイテレータで変換するためには
マップでイテレータに直接変換することはできないので、
マップからEntryで成り立つセットを抽出してからそのセットからイテレータを抽出して使います。
イテレータの削除処理はオブジェクトのアドレスに直接適用されるので、
下記の出力結果のように現本のマップのデータも削除されます。
1 2 3 4 5 6 |
a=apple b=banana c=coconut d=dried persimmon {a=apple, b=banana, d=dried persimmon} [a=apple, b=banana, d=dried persimmon] |
終わりに
今回の記事は以上になります。
ご覧いただきありがとうございます。
コメント