更好的使用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属性进行了排序。

    

相关文章
相关标签/搜索