ArrayDeque

کلاس ArrayDeque زیر کلاس AbstractCollection است و مفهوم صف دو طرفه را با استفاده از ساختمان داده آرایه حلقوی (circular array) پیاده سازی کرده است و کلاسی فوق العاده سریع و بهینه است این کلاس برای پیاده سازی صف دو طرفه به جای لیست پیوندی از آرایه استفاده می کند و دارای مزایای زیر است :

  • اگر به عنوان صف FIFO از آن استفاده شود از LinkedList سریعتر خواهد بود.
  • اگر به عنوان صف LIFO یا همان پشته از آن استفاده شود از کلاس Stack سریعتر خواهد بود.
  • می توان به عنوان یک آرایه پویا (آرایه قابل رشد) به جای ArrayList هم از آن استفاده کرد.

این کلاس از طریق مسیر java.util.ArrayDeque قابل دستیابی است.برای ساخت شی جدید از این کلاس می توانیم از یکی از سازنده های زیر استفاده کنیم :

ArrayDeque()

یک صف دو طرفه خالی ایجاد می کند.

ArrayDeque(Collection c)

یک صف دو طرفه جدید ایجاد می کند و اعضای کالکشن c را به آن اضافه می کند.

ArrayDeque(int numElements)

به صورت پیش فرض ArrayDeque با یک آرایه با اندازه 16 شروع به کار می کند و در صورت نیاز اندازه آن افزایش می یابد ، با استفاده از سازنده فوق می توانیم آرایه اولیه ای با اندازه ای به غیر از 16 به اندازه numElements در آن ایجاد کنیم که البته باز هم اندازه آن در صورت نیاز افزایش خواهد یافت.متد های مهم این کلاس در جدول زیر آمده اند :

متد کاربرد
add(Object o) یک شی جدید به انتهای صف اضافه می کند.
addFirst(Object o) یک شی جدید به ابتدای صف اضافه می کند.
addLast(Object o) یک شی جدید به انتهای صف اضافه می کند.
clear() کل مجموعه را پاک می کند.
contains(Object o) وجود یا عدم وجود یک شی را بررسی می کند.
descendingIterator() یک Iterator معکوس برای پیمایش از انتها به ابتدای لیست بر می گرداند.
element() عنصر ابتدای صف را بر می گرداند ولی آن را حذف نمی کند.
getFirst() مانند متد قبل عمل می کند.
getLast() عنصر انتهای صف را بر می گرداند ولی آن را حذف نمی کند.
isEmpty() خالی بودن یا نبودن مجموعه را بررسی می کند.
iterator() یک iterator برای پیمایش ابتدا تا انتهای لیست بر می گرداند.
offer(Object o) یک عنصر به انتهای صف اضافه می کند.
offerFirst(Object o) یک عنصر به ابتدای صف اضافه می کند.
offerLast(Object o) یک عنصر به انتهای صف اضافه می کند.
peek() عنصر ابتدای صف را بر می گرداند ولی آن را حذف نمی کند.
peekFirst() عنصر ابتدای صف را بر می گرداند ولی آن را حذف نمی کند.
peekLast() عنصر انتهای صف را بر می گرداند ولی آن را حذف نمی کند.
poll() عنصر ابتدای صف را حذف کرده و بر می گرداند.
pollFirst() عنصر ابتدای صف را حذف کرده و بر می گرداند.
pollLast() عنصر انتهای صف را حذف کرده و بر می گرداند.
pop() عنصر بالای پشته را حذف کرده و بر می گرداند.
push(Object o) یک عنصر به بالای پشته اضافه می کند.
remove() عنصر ابتدای صف را حذف می کند.
remove(Object o) یک شی را از صف حذف می کند.
removeFirst() عنصر ابتدای صف را حذف می کند
removeLast() عنصر انتهای صف را حذف می کند.
removeFirstOccurrance(Objcet o) ابتدایی ترین نمونه از یک شی را حذف می کند.
removeLast() عنصر انتهای صف را حذف می کند.
removeLastOccurance(Object o) انتهایی ترین نمونه از یک شی را حذف می کند.
size() تعداد اعضای مجموعه را بر می گرداند.
toArray() اعضای مجموعه را به صورت یک آرایه بر می گرداند.

استفاده از ArrayDeque به عنوان صف FIFO

import java.util.ArrayDeque;

public class ArrayDequeDemo
{
    public static void main(String[] args)
    {
        ArrayDeque fifo = new ArrayDeque();

        fifo.add("A");
        fifo.add("B");
        fifo.add("C");
        fifo.add("D");

        while (!fifo.isEmpty())
        {
            System.out.println(fifo.poll());
        }
    }
}
A
B
C
D

درکد قبل از ArrayDeque به عنوان صف FIFO استفاده کردیم و مشاهده می کنید که شی ای که اول وارد صف اول هم از صف خارج شده ، برای خروج اشیا از صف از یک حلقهwhile استفاده کردیم و تا زمانی که صف خالی نشد (متد isEmpty مقدار true بر نگرداند) عنصر ابتدای صف را با متد poll خارج کرده و چاپ نمودیم.

استفاده از ArrayDeque به عنوان صف LIFO

اگر قصد داشته باشیم از ArrayDeque به عنوان پشته (صف LIFO) استفاده کنیم بهتر است از متد ها push ، pop و peek استفاده کنیم ، دقت کنید که در این حالت متد peek عنصر بالای پشته را بر می گرداند ولی آن را حذف نمی کند و متد pop عنصر بالای پشته را حذف می کند و بر می گرداند.

import java.util.ArrayDeque;

public class ArrayDequeDemo
{
    public static void main(String[] args)
    {
        ArrayDeque stack = new ArrayDeque();

        stack.push("A");
        stack.push("B");
        stack.push("C");
        stack.push("D");


        while (!stack.isEmpty())
        {
            System.out.println(stack.peek());
            System.out.println(stack.pop());
        }

    }
}
D
D
C
C
B
B
A
A

همانطور که مشاهده می کنید این بار شی ای که آخر وارد شده اول خارج شده است ، همچنین مشاهده می کنید که خروجی متد های peek و pop یکسان است. حلقه while تا زمانی خالی شدن صف (بر قرار شد شرط isEmpty) اجرا می شود.