更好的使用Java集合(三)

隊列、雙端隊列和優先級隊列java

    隊列能夠有效地在尾部添加一個元素,在頭部刪除一個元素。有兩個端頭的隊列叫雙端隊列。this

    能夠有效地在頭部和尾部添加或刪除元素,但不支持在隊列中間添加元素。JavaSE6中引入了Deque接口,並由ArrayDeque和LinkedList類實現。spa

add(E element);offer(E element);code

addFirst(E element);offerFirst(E element);排序

addLast(E element);offerLast(E element);
接口

將給定元素添加到雙端隊列的頭部或尾部。若是隊列滿了,add*(E element)方法將拋出IllegalStateException異常,而offer*(E element)方法返回false。隊列

remove();poll();element

removeFirst();pollFirst();rem

removeLast();pollLast();
若是隊列不爲空,刪除並返回隊列頭部或尾部的元素。若是隊列爲空,remove*()方法將拋出NoSuchElementException異常,而poll*()方法返回null。

element();peek();get

getFirst();peekFirst();

getLast();peekLast();
若是隊列不爲空,返回隊列頭部或尾部的元素。若是隊列爲空,element()方法和get*()方法將拋出NoSuchElementException異常,而peek*()方法返回null。

    優 先級隊列(priority queue)中的元素能夠按照任意的順序插入,但卻老是按照排序的順序進行檢索。不管什麼時候調用remove方法,總會得到當前優先級隊列中最小的元素。優 先級隊列並無對全部的元素進行排序,而是使用了堆(heap)。堆是一個能夠自我調整的二叉樹,能夠讓最小的元素移動到根,而沒必要花費時間對元素進行排 序。

    public class Task {
        public Task() {
        }

        public Task(String name, int priority) {
            super();
            this.name = name;
            this.priority = priority;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getPriority() {
            return priority;
        }

        public void setPriority(int priority) {
            this.priority = priority;
        }

        private String name;
        private int priority;
    }

    @Test
    public void PriorityQueueTest() {
        PriorityQueue<Task> pq = new PriorityQueue<Task>(
                new Comparator<Task>() {
                    public int compare(Task t1, Task t2) {
                        return t1.getPriority() - t2.getPriority();
                    }
                });

        pq.add(new Task("task1", 20));
        pq.add(new Task("task2", 10));
        pq.add(new Task("task3", 30));

        for (Task t : pq)
            System.out.println(t.getName() + "," + t.getPriority());
    }

    結果返回了task2,10;task1,20;task3,30。經過Task的priority屬性進行了排序。

    

相關文章
相關標籤/搜索