Javaにおけるデックデータ構造
メニューを表示するにはスワイプしてください
両端キュー
Deque(両端キュー)は、キューの前方と後方の両方から操作を行うためのデータ構造。
DequeインターフェースはQueueインターフェースを拡張しているため、LinkedListのようなクラスもこのインターフェースを実装している。
そのため、再びLinkedListを使用するが、今回は新しいインターフェースで利用する。
Deque型でオブジェクトを宣言する方法は、Queueの場合と変わらない。
Main.java
1Deque<T> deque = new LinkedList<>();
主な違いは、このインターフェースのメソッドに関して現れます。
Dequeは両端キューであり、キューの先頭と末尾の両方で要素を操作できるため、そのメソッドはこの特徴に合わせて設計されています。
メソッド
Dequeインターフェースの主なメソッドには以下があります:
addFirst(element): デックの先頭に要素を追加;addLast(element): デックの末尾に要素を追加。
明らかに、デックには先頭と末尾に追加するためのメソッドが用意されています。これらのメソッド名は直感的です。 これらのメソッドをコードで確認します:
Main.java
123456789101112131415package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.addFirst("One"); deque.addLast("Two"); System.out.println("Deque: " + deque); deque.addFirst("Zero"); System.out.println("Deque after the `addFirst()` method: " + deque); } }
ご覧のとおり、addFirst() メソッドを使用すると、要素がデックの先頭に追加されます。これは addLast() メソッドとの違いです。
Deque には通常の add() メソッドもあり、これは addLast() メソッドと同じ動作をします。そのため、どのメソッドを使用するかは完全に任意です。
削除メソッド
先頭や末尾に要素を追加するメソッドがある場合、デックの先頭や末尾から削除するメソッドも存在します。
removeFirst(): デックの先頭から要素を削除して返す;removeLast(): デックの末尾から要素を削除して返す。
addFirst() および addLast() メソッドは、デックの先頭や末尾から要素を削除します。
コードでの使用例を見てみましょう:
Main.java
1234567891011121314151617package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); deque.removeFirst(); deque.removeLast(); System.out.println("Deque after the removal methods method: " + deque); } }
ご覧のとおり、デックから最初と最後の要素を削除し、2番目の要素だけが残っています。
シンプルで便利であり、メソッド名も直感的です。
取得メソッド
次に、デック内の要素へアクセスするメソッドについて説明します。
getFirst(): デックの先頭要素を取得しますが、削除はしません;getLast(): デックの末尾要素を取得しますが、削除はしません。
これにより、両端キューの最初と最後の要素にアクセスできます。
それでは、コード例を見てみましょう:
Main.java
123456789101112131415161718package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); deque.add("One"); deque.add("Second"); deque.add("Third"); System.out.println("Deque: " + deque); String first = deque.getFirst(); String last = deque.getLast(); System.out.println("The first element in the deque: " + first); System.out.println("The last element in the deque: " + last); } }
getFirst() および getLast() メソッドを使用して、deque から最初と最後の要素を取得し、新しく作成した変数に代入しました。
Deque インターフェースには、peekFirst() および peekLast() メソッドもあり、例外がスローされる問題に対応しています。例外をスローしてプログラムを停止する代わりに、キューが空の場合は null を返します。
例を見てみましょう:
Main.java
123456789101112131415package com.example; import java.util.Deque; import java.util.LinkedList; public class Main { public static void main(String[] args) { Deque<String> deque = new LinkedList<>(); System.out.println("Deque: " + deque); String first = deque.peekFirst(); System.out.println("The first element in the deque: " + first); String last = deque.getLast(); System.out.println("The last element in the deque: " + last); } }
この例から、peekFirst() や peekLast() よりも getFirst() および getLast() メソッドを使用する方がはるかに良いことが明らかになりました。これらはエラー時にプログラムを停止させません。
ただし、NullPointerException には注意が必要です。この例外はプログラムに多くの問題を引き起こす可能性があります。
addFirst()、addLast()、removeFirst()、removeLast() メソッドには、同等の代替メソッドも存在します。これらのメソッドの動作はすでに理解しているため、詳細な説明は省略しますが、以下に一覧を示します。
代替メソッド
Deque に要素を追加するためのメソッド:
offerFirst(E e): 可能であれば要素をデックの先頭に追加し、trueを返します。追加できない場合はfalseを返します;offerLast(E e): 可能であれば要素をデックの末尾に追加し、trueを返します。追加できない場合はfalseを返します;push(E e): 要素をデックの先頭に追加します。addFirst()と同様です。push()はDequeクラスのスタックメソッドでもあることに注意してください。
Deque から要素を削除するためのメソッド:
pollFirst(): デックの最初の要素を削除して返します。デックが空の場合はnullを返します;pollLast(): デックの最後の要素を削除して返します。デックが空の場合はnullを返します;pop(): デックの最初の要素を削除して返します。removeFirst()と同様です。
選択はプログラムの要件によって異なります。すべてを通常の配列で解決することも可能ですが、それは非常に困難であり、最適化もされません。そのため、さまざまなデータ構造が存在し、さまざまなプログラムの作成をより便利にしています。
1. 「Deque」は何の略ですか?
2. JavaでDequeを表すインターフェースはどれですか?
3. DequeにおけるaddFirst()メソッドの目的は何ですか?
4. Dequeの末尾要素を取得するが削除しないメソッドはどれですか?
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください