Iterate over Deque in Java (Forward and backward direction)
This post will discuss various methods to iterate over Deque in Java.
A Deque is a linear collection that supports insertion and removal at both ends. All Deque implementations like ArrayDeque, LinkedList, etc., use “double ended queue”, which provides a more complete and consistent set of LIFO and FIFO operations.
We should use Deque in preference to the Stack class (see this). Following are few methods provided by the Deque interface to support stack operations:
push(E e)Pushes the specified element at the head of this deque.E pop()Pops an element from the head of this deque. In other words, it removes and returns the first element of this deque.Iterator<E> iterator()Returns an iterator over the elements in this deque. The elements are returned from head to tail.
Similarly, the following are few methods provided by the Deque interface to support queue operations:
boolean add(E e)Inserts the specified element at the tail of this deque.E remove()Retrieves and removes the head of this deque (in other words, the first element of this deque).Iterator<E> descendingIterator()Returns an iterator over the elements in this deque in reverse sequential order, i.e., the elements are returned from tail to head.
1. Using Iterator
We can use iterator() that returns an iterator to iterate over a deque in LIFO order, i.e., the elements will be traversed from head to tail, as shown below:
|
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 |
import java.util.ArrayDeque; import java.util.Deque; import java.util.Iterator; class Main { // Iterate over a Deque in Java public static void main(String[] args) { Deque<Integer> deque = new ArrayDeque<Integer>(); deque.push(1); deque.push(2); deque.push(3); // Returns an iterator over the elements in this deque Iterator<Integer> it = deque.iterator(); // prints [3, 2, 1] while (it.hasNext()) { System.out.println(it.next()); } // Java 8 and above – prints [3, 2, 1] // use `forEachRemaining()` provided by `java.util.Iterator` interface deque.iterator().forEachRemaining(System.out::println); } } |
We can use descendingIterator() that returns an iterator to iterate over a deque in FIFO order, i.e., the elements will be traversed from tail to head, as shown below:
|
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 |
import java.util.ArrayDeque; import java.util.Deque; import java.util.Iterator; class Main { // Iterate over a Deque in Java public static void main(String[] args) { Deque<Integer> deque = new ArrayDeque<Integer>(); deque.push(1); deque.push(2); deque.push(3); // Returns an iterator over the elements in this deque in // reverse sequential order Iterator<Integer> itr = deque.descendingIterator(); // prints [1, 2, 3] while (itr.hasNext()) { System.out.println(itr.next()); } // Java 8 and above – prints [1, 2, 3] // use `forEachRemaining()` provided by `java.util.Iterator` interface deque.descendingIterator().forEachRemaining(System.out::println); } } |
Please note that the iterator will throw a ConcurrentModificationException if the deque is modified after it is created except through the iterator’s own remove method.
2. Using enhanced for-loop
As Deque implements Iterable interface, we can use enhanced for-loop to loop through deque in LIFO order, as shown below:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.util.Deque; import java.util.ArrayDeque; class Main { // Iterate over a Deque in Java public static void main(String[] args) { Deque<Integer> deque = new ArrayDeque<Integer>(); deque.push(1); deque.push(2); deque.push(3); // enhanced for-loop also uses an iterator behind the scenes // prints [3, 2, 1] for (Integer item: deque) { System.out.println(item); } } } |
3. Java 8 – Converting Deque to Streams
In Java 8 and above, we can loop a deque in LIFO order with the help of streams, lambdas, and forEach, as shown below:
|
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 |
import java.util.Deque; import java.util.ArrayDeque; import java.util.stream.Stream; class Main { // Iterate over a Deque in Java public static void main(String[] args) { Deque<Integer> deque = new ArrayDeque<Integer>(); deque.push(1); deque.push(2); deque.push(3); // 1. Get stream and use lambda expression deque.stream().forEach(S -> System.out.println(S)); // or by providing method reference deque.stream().forEach(System.out::println); // 2. Using `forEach()` inherited from `java.lang.Iterable` interface deque.forEach(System.out::println); // 3. Using `Stream.of()` to get `Stream<Integer>` Stream.of(deque.toArray()) .forEach(System.out::println); } } |
4. Converting Deque to array
We can first convert the deque into an array using toArray() method and then print it using Arrays.toString() method. There are many implementations of toArray() method, as shown below:
|
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
import com.google.common.collect.FluentIterable; import com.google.common.collect.Iterables; import java.util.ArrayDeque; import java.util.Arrays; import java.util.Deque; class Main { // Iterate over a Deque in Java public static void main(String[] args) { Deque<Integer> deque = new ArrayDeque<>(); deque.push(1); deque.push(2); deque.push(3); // Convert a Deque to an array Integer[] array = null; // 1. Using `Deque.toArray(T[])` method array = deque.toArray(new Integer[deque.size()]); System.out.println(Arrays.toString(array)); // 2. `Deque.toArray(T[])` – without allocating any memory array = deque.toArray(new Integer[0]); System.out.println(Arrays.toString(array)); // 3. Using `Deque.toArray()` method System.out.println(Arrays.toString(deque.toArray())); // 4. Java 8 – Streams + method references array = deque.stream().toArray(Integer[]::new); System.out.println(Arrays.toString(array)); // 5. Java 8 – Streams + lambda expressions array = deque.stream().toArray(n -> new Integer[n]); System.out.println(Arrays.toString(array)); // 6. Using `FluentIterable` class from Guava library array = FluentIterable.from(deque).toArray(Integer.class); System.out.println(Arrays.toString(array)); // 7. Using `Iterables` class from Guava library array = Iterables.toArray(deque, Integer.class); System.out.println(Arrays.toString(array)); } } |
5. Converting Deque to Vector
The Enumeration interface provides methods to enumerate through the elements of a Vector. So, we can convert the deque into a vector and finally print all elements of that vector.
|
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 32 33 34 |
import java.util.*; class Main { // Iterate over a Deque in Java public static void main(String[] args) { Deque<Integer> deque = new ArrayDeque<>(); deque.push(1); deque.push(2); deque.push(3); // 1. Convert the deque into a vector @Deprecated Enumeration<Integer> enumeration = new Vector<>(deque).elements(); // if enumeration contains more elements while (enumeration.hasMoreElements()) { // print the next element of the enumeration System.out.println(enumeration.nextElement()); } // 2. `Collections.enumeration()` returns an enumeration over the // specified collection enumeration = Collections.enumeration(deque); while (enumeration.hasMoreElements()) { System.out.println(enumeration.nextElement()); } } } |
6. Converting Deque to String
If we’re only required to display contents of the deque, we can print the string representation of deque using the toString() method, as shown below:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import java.util.Deque; import java.util.ArrayDeque; import java.util.stream.Stream; class Main { // Iterate over a Deque in Java public static void main(String[] args) { Deque<Integer> deque = new ArrayDeque<Integer>(); deque.push(1); deque.push(2); deque.push(3); // 1. Convert to string using `toString()` System.out.println(deque.toString()); // 2. Java 8 and above Stream.of(deque.toString()) .forEach(System.out::println); } } |
That’s all about iterating over Deque in Java.
Thanks for reading.
To share your code in the comments, please use our online compiler that supports C, C++, Java, Python, JavaScript, C#, PHP, and many more popular programming languages.
Like us? Refer us to your friends and support our growth. Happy coding :)