Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

JavaのDequeの概要や使い方+サンプルプログラムもご紹介

投稿日:2021年3月18日 更新日:

<目次>

(1) JavaのDequeの概要や使い方+サンプルプログラムもご紹介
 (1-1) Dequeとは?
 (1-2) Dequeを実装したクラス
 (1-3) Dequeの使い方
 (1-4) Dequeのサンプルプログラム

(1) JavaのDequeの概要や使い方+サンプルプログラムもご紹介

(1-1) Dequeとは?

「Deque」はJavaAPIが提供するスタック機能を持つインターフェイスです(java.util.Deque)。「double ended queue」の略で、キューの両端から要素を追加・削除できるのが特徴です。読み方は「デック」と読み、dequeue(デキュー=キューからデータを取り出し)とは異なるため注意が必要です。
 
両端からの追加・削除が可能であるため、キュー(First In First Out)とスタック(Last In First Out)の両方の用途で使う事ができます。
 
そのために多くのメソッドが用意されています。
(表①)Dequeインターフェイスのメソッド
■メソッド名
※カッコ()内は別名
■作用箇所 ■機能 ■例外時
addFirst
(push)
先頭 追加(挿入) 例外を発生
offerFirst 先頭 追加(挿入) falseやnullを返却
removeFirst
(pop, remove)
先頭 取得(削除) 例外を発生
pollFirst
(poll)
先頭 取得(削除) falseやnullを返却
getFirst
(element)
先頭 参照(検査) 例外を発生
peekFirst
(peek)
先頭 参照(検査) falseやnullを返却
addLast
(add)
末尾 追加(挿入) 例外を発生
offerLast
(offer)
末尾 追加(挿入) falseやnullを返却
removeLast 末尾 取得(削除) 例外を発生
pollLast 末尾 取得(削除) falseやnullを返却
getLast 末尾 参照(検査) 例外を発生
peekLast 末尾 参照(検査) falseやnullを返却
「java.util.Queue」インターフェイスを継承しているため、DequeではQueueインターフェイスに定義されたメソッドも使う事ができます(add、element、offer、peek、poll、remove)。また処理によっては複数のメソッド名が記載されているものもありますが、これらは従来のインターフェイスとの互換の関係で、全く同じ機能だが名前が違うメソッドがある状態となっており、どちらを使っても問題ないですが、どれかに統一する事が望ましいです(例えばaddFirstとpushは全く同じ機能)。
 
(参考)
似たクラスで「java.util.stack」パッケージの「Stack」クラスがありますが、こちらの方が古く、同じ処理がDequeで出来るため、特にこだわりが無ければDequeを使うと良いかも知れません。
 

(1-2) Dequeを実装したクラス

Dequeインターフェイスを実装したクラスは、以下がJavaのAPIとして用意されています。

①java.util.LinkedList
②java.util.ArrayDeque
 
①の「LinkedList」はDeque及びQueueを実装したスタンダードなクラスで、内部的にはLinked Listにより要素を保持します。
②の「ArrayDeque」は内部的には配列に要素を格納しており、要素数が予め確保した領域を上回ると、新しく必要なサイズの配列を確保しなおし、要素はそちらに引っ越しします
 

(1-3) Dequeの使い方+サンプルプログラム

STEP1:Dequeのインスタンス作成

Dequeのインスタンスは、Dequeインターフェイスを実装したLinkedListクラスやArrayDequeクラスをインスタンス化する事で作れます。

(例)
Deque<String> dq1 = new ArrayDeque<>();
Deque<String> dq2 = new LinkedList<>();

STEP2:各メソッドを利用してキューやスタックの操作

あとは前節でご紹介した(表①)のメソッドを使って、要素を追加・削除して使います。「スタック」として利用した例と、「キュー」として利用した例をそれぞれご紹介します。
 

(1-4) Dequeのサンプルプログラム

「キュー」のサンプルと「スタック」のサンプルをそれぞれご紹介します。

キューのサンプルプログラム

import java.util.Deque;
import java.util.LinkedList;

public class IT0285_QueueSample {
    public static void main(String[] args) {
        Deque<String> que = new LinkedList<>();
        try {
            //「最上」の要素を「挿入」
            que.addLast("Apple");
            que.addLast("Banana");
            que.addLast("Coffee");
            System.out.println("# ①:"+que);

            //「最上」の要素を「削除」
            System.out.printf("### dequeue:%20s\n",que.removeFirst());
            //「最上」の要素を「参照」
            System.out.printf("### getFirst:%20s\n",que.getFirst());
            //「最上」の要素を「挿入」
            que.addLast("Donuts");
            System.out.println("# ②:"+que);

            //「最上」の要素を「削除」
            System.out.printf("### dequeue:%20s\n",que.removeFirst());
            System.out.printf("### dequeue:%20s\n",que.removeFirst());
            System.out.printf("### dequeue:%20s\n",que.removeFirst());
            System.out.println("# ③:"+que);

            //「最上」の要素を「削除」
            //→要素が1つもないため、例外が発生
            System.out.printf("### dequeue:%20s\n",que.removeFirst());
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

(図141)実行結果

目次にもどる

スタックのサンプルプログラム

import java.util.ArrayDeque;
import java.util.Deque;

public class IT0285_StackSample {
    public static void main(String[] args) {
        Deque stk = new ArrayDeque<>();
        try {
            //「最上」の要素を「挿入」
            stk.push("Apple");
            stk.push("Banana");
            stk.push("Coffee");
            System.out.println("# ①:"+stk);

            //「最上」の要素を「削除」
            System.out.printf("### pop:%21s\n",stk.pop());
            //「最上」の要素を「参照」
            System.out.printf("### peek:%20s\n",stk.peek());
            //「最上」の要素を「挿入」
            stk.push("Donuts");
            System.out.println("# ②:"+stk);

            //「最上」の要素を「削除」
            System.out.printf("### pop:%21s\n",stk.pop());
            System.out.printf("### pop:%21s\n",stk.pop());
            System.out.printf("### pop:%21s\n",stk.pop());
            System.out.println("# ③:"+stk);

            //「最上」の要素を「削除」
            //→要素が1つもないため、例外が発生
            System.out.printf("### pop:%21s\n",stk.pop());

        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

(図142)実行結果

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

オープンアドレス法をJavaで実装したプログラムのサンプルをご紹介

<目次> (1) オープンアドレス法をJavaで実装したプログラムのサンプルをご紹介  (1-1) オープンアドレス法とは  (1-2) Javaのサンプルプログラムの全体像  (1-3) Javaの …

Tomcatの起動時のエラー「アドレスは既に使用中です」や「必要な幾つかのポートがすでに使用中です」の対処方法

<目次> (1) Tomcatの起動時のエラー「アドレスは既に使用中です」や「必要な幾つかのポートがすでに使用中です」の対処方法  (1-1) 発生状況  (1-2) 原因  (1-3) 対処方法 ( …

サーブレットとは?その役割やHelloWorldサンプルコードのご紹介

(0)目次&概説 (1) サーブレットの基本  (1-1) サーブレットとは?  (1-2) サーブレットの前身技術との比較  (1-3) サーブレットとJSPの違い  (1-4) サーブレットのHe …

double型で誤差が発生する件について+発生事例やサンプルプログラムも紹介

<目次> (1) double型では誤差が発生する事について  (1-1) double型は近似値を使用している  (1-2) double型の誤差の例 (1) double型で誤差が発生する件につい …

Javaのenumとは?使い方や意味を様々な利用シーンでご紹介(if、for、switch他)

<目次> (1) Javaのenumとは?意味や用途を様々な利用シーンでご紹介   (1-1) enumとは?  (1-2) 構文(enumの定義)  (1-3) 様々なenumの使用例 (1) Ja …

  • English (United States)
  • 日本語
Top