待ち行列としての利用

広告

LinkedListでは今まで見てきたような可変長配列としての利用の他に、キューとしても利用できるようになっています。キューと言うのは先入れ先出し法(FIFO)と呼ばれる方式の一つで先に追加されたデータが最初に処理されるというものです。

例えば苦情受付センターみたいなところの業務で考えて見ます。苦情の電話はどんどんかかってくるので処理するべきリストに追加していき、そして苦情が来た順番に処理していくわけです。この場合、新しくかかってきた苦情はリストの最後に追加し、処理する時はリストの一番先頭にある苦情を処理します。このような方式を先入れ先出し法と言います。

今まで見てきたメソッドでも要素を追加する時はリストの最後に追加し、処理する時はインデックス番号が0番目の要素を取り出して処理すれば同じことが出来るのですが、先入れ先出し法を使う場合は一般的なメソッド名があり同じ機能であっても違うメソッド名が用意されているわけです。

では順に見ていきます。新しい要素をリストの最後に追加するにはLinkedListクラスで用意されている"offer"メソッドを使います。

指定された要素をこのリストの末尾 (最後の要素) に追加します。

パラメータ:
  o - 追加する要素 
戻り値:
  true (Queue.offer の一般規約に従う)

次に取り出す方法です。リストの先頭から要素を取り出すにはLinkedListクラスで用意されている"peek"メソッドを使います。

このリストの先頭 (最初の要素) を取得しますが、削除はしません。

戻り値:
  キューの先頭。キューが空の場合は null

また"element"メソッドも同じ機能となります。ただ要素が無いのに取り出そうとした場合、こちらは例外を投げます。

このリストの先頭 (最初の要素) を取得しますが、削除はしません。

戻り値:
  キューの先頭 
例外: 
  NoSuchElementException - キューが空の場合

また同じような機能ですが、先頭の要素を取り出しつつ、同時に先頭の要素を削除するメソッドも用意されています。"poll"メソッドと"remove"メソッドですが、"poll"の場合は要素が無い場合はNULLを返しますが"remove"メソッドの場合は例外を投げます。

pollメソッド:

このリストの先頭 (最初の要素) を取得し、削除します。

戻り値:
  キューの先頭。キューが空の場合は null

removeメソッド:

このリストの先頭 (最初の要素) を取得し、削除します。

戻り値:
  キューの先頭 
例外: 
  NoSuchElementException - キューが空の場合

使い方としては下記のような感じとなります。

LinkedList<String> array = new LinkedList<String>();

array.offer("色が違う");
array.offer("サイズが合わない");
array.offer("壊れていた");

System.out.println(array.poll());
System.out.println(array.poll());

array.offer("商品が違う");

System.out.println(array.poll());
System.out.println(array.poll());

最初に書いたとおり、"add"メソッドや"get"メソッドでも同じことが出来ますが、キューとしてLinkedListを使う場合はメソッド名もキュー用のものを使った方が分かりやすいと思います。

サンプルプログラム

では実際に試してみます。

collectionTest9

import java.util.LinkedList;

class collectionTest9{
  public static void main(String args[]){
    LinkedList<String> array = new LinkedList<String>();

    array.offer("色が違う");
    array.offer("サイズが合わない");
    array.offer("壊れていた");

    System.out.println(array.poll());
    System.out.println(array.poll());

    array.offer("商品が違う");

    System.out.println(array.poll());
    System.out.println(array.poll());
  }
}

上記をコンパイルして実際に実行してみると下記のようになります。

p4

( Written by Tatsuo Ikura )