第44回 Queueインターフェース
今回のテーマは「Queue」です。
キューは先に格納されたデータから取り出す性質(FIFO)を持ち、Javaではその機能はQueueインターフェースにより提供されています。 Queueインターフェースは、ListインターフェースやSetインターフェースと同様にCollectionインターフェースのサブインターフェースです。 Queueインターフェースを実装するクラスにはLinkedList、PriorityQueueなどがあります。
次のサンプルコードは要素を3回ごとに改行し出力するプログラムです。(J2SE5.0以上対応)
import java.util.Collections; import java.util.LinkedList; import java.util.Queue; public class Main { public static void main(String[] args) { Queue<String> queue = new LinkedList<String>(); Collections.addAll(queue, "b", "A", "d", "E", "C"); while (!queue.isEmpty()) { for (int i = 0; i < 3; i++) { String string = queue.poll(); if (string != null) { System.out.print(string); } } System.out.println(); } } }
pollメソッドはQueueから要素を取り出し、その要素をQueueから削除します。 Queueに要素がない場合、pollメソッドはnullを返します。 サンプルコードでは要素を取り出す際にそのQueueに要素があるかどうかはチェックしていません。 要素数に関係なく要素を入れた順に取り出し出力しているのです。
PriorityQueueはFIFOではありません。 PriorityQueueはComparatorをコンストラクタに渡し要素を取り出す順番を指定することができます。 次のサンプルコードは大文字と小文字の区別なしでアルファベット順に出力した後、格納順で出力するプログラムです。(J2SE5.0以上対応)
import java.util.Collections; import java.util.PriorityQueue; import java.util.Queue; public class Main { public static void main(String[] args) { Queue<String> queue = new PriorityQueue<String>(11, String.CASE_INSENSITIVE_ORDER); Collections.addAll(queue, "b", "A", "d", "E", "C"); while (!queue.isEmpty()) { System.out.print(queue.poll()); } System.out.println(); Collections.addAll(queue, "b", "A", "d", "E", "C"); for (String string : queue) { System.out.print(string); } } }
実行するとwhileループの場合は”A”,”b”,”C”,”d”,”E”の順に出力されますが、拡張forループの場合は指定した順序で出力されません。
PriorityQueueは指定した順番に従って要素を格納しているわけではないようです。
したがって、拡張for文やiteratorを使用した場合には順番が保証されません。