【问题标题】:ArrayList to emulate a queue - JavaArrayList 模拟队列 - Java
【发布时间】:2015-03-18 11:54:15
【问题描述】:

我想在 Java 中使用 ArrayList 并将其实现为队列。使用queue.add("element") 添加到队列应该相当容易。虽然,删除弹出项目有点棘手。我想这样做的方式如下:

public String pop(){
    String s = queue.get(0);
    queue.remove(0);
    queue.trimToSize();
    return s;
}

这是正确的方法吗?下次调用 pop() 方法时,我会得到队列的下一个元素吗?

【问题讨论】:

  • 为什么要使用 ArrayList 而不是专用的,例如 ArrayDeque

标签: java arraylist queue


【解决方案1】:

如果您真的需要使用ArrayListremove() 已经可以满足您的所有需求。您应该能够仅使用add()remove(0) 来实现队列。您的 pop() 方法可以实现为:

public String pop() {
    return queue.remove(0);
}

来自documentation

移除

public E remove(int index)

删除此列表中指定位置的元素。 将任何后续元素向左移动(从它们的索引中减去一个)

返回:从列表中移除的元素

不过,正如其他人所建议的那样,ArrayDeque 更适合队列。

【讨论】:

    【解决方案2】:

    尝试下面提到的使用 ArrayDeque 的实现

    import java.util.ArrayDeque;
    import java.util.Collection;
    import java.util.Iterator;
    
    public class QueueImpl<E>
    {
        private ArrayDeque<E> arrayDeque;
    
        /**
         * Constructs an empty array deque with an initial capacity sufficient to
         * hold 16 elements.
         **/
        public QueueImpl()
        {
            arrayDeque = new ArrayDeque<E>();
        }
    
        /**
         * Constructs a deque containing the elements of the specified collection,
         * in the order they are returned by the collection's iterator.
         **/
        public QueueImpl(Collection<? extends E> c)
        {
            arrayDeque = new ArrayDeque<E>(c);
        }
    
        /**
         * Constructs an empty array deque with an initial capacity sufficient to
         * hold the specified number of elements.
         **/
        public QueueImpl(int numElements)
        {
            arrayDeque = new ArrayDeque<E>(numElements);
        }
    
        /** Inserts the specified element at the tail of this queue. **/
        public boolean add(E e)
        {
            return arrayDeque.add(e);
        }
    
        /** Atomically removes all of the elements from this queue. **/
        public void clear()
        {
            arrayDeque.clear();
        }
    
        /** Returns true if this queue contains the specified element. **/
        public boolean contains(Object o)
        {
            return arrayDeque.contains(o);
        }
    
        /** Returns an iterator over the elements in this queue in proper sequence. **/
        public Iterator<E> iterator()
        {
            return arrayDeque.iterator();
        }
    
        /**
         * Inserts the specified element at the tail of this queue if it is possible
         * to do so immediately without exceeding the queue's capacity, returning
         * true upon success and false if this queue is full.
         **/
        public boolean offer(E e)
        {
            return arrayDeque.offer(e);
        }
    
        /**
         * Retrieves, but does not remove, the head of this queue, or returns null
         * if this queue is empty.
         **/
        public E peek()
        {
            return arrayDeque.peek();
        }
    
        /**
         * Retrieves and removes the head of this queue, or returns null if this
         * queue is empty.
         **/
        public E poll()
        {
            return arrayDeque.poll();
        }
    
        /**
         * Removes a single instance of the specified element from this queue, if it
         * is present.
         **/
        public boolean remove(Object o)
        {
            return arrayDeque.remove(o);
        }
    
        /** Returns the number of elements in this queue. **/
        public int size()
        {
            return arrayDeque.size();
        }
    
        /**
         * Returns an array containing all of the elements in this queue, in proper
         * sequence.
         **/
        public Object[] toArray()
        {
            return arrayDeque.toArray();
        }
    
        /**
         * Returns an array containing all of the elements in this queue, in proper
         * sequence; the runtime type of the returned array is that of the specified
         * array.
         **/
        public <T> T[] toArray(T[] a)
        {
            return arrayDeque.toArray(a);
        }
    
        /** Returns a string representation of this collection. **/
        public String toString()
        {
            return arrayDeque.toString();
        }
    
        /** Inserts the specified element at the front of this deque. **/
        public void addFirst(E e)
        {
            arrayDeque.addFirst(e);
        }
    
        /** Inserts the specified element at the end of this deque. **/
        public void addLast(E e)
        {
            arrayDeque.addLast(e);
        }
    
        /** Retrieves, but does not remove, the first element of this deque. **/
        public void getFirst()
        {
            arrayDeque.getFirst();
        }
    
        /** Retrieves, but does not remove, the last element of this deque. **/
        public void getLast()
        {
            arrayDeque.getLast();
        }
    
        /** Inserts the specified element at the front of this deque. **/
        public boolean offerFirst(E e)
        {
            return arrayDeque.offerFirst(e);
        }
    
        /** Inserts the specified element at the end of this deque. **/
        public boolean offerLast(E e)
        {
            return arrayDeque.offerLast(e);
        }
    
        /**
         * Retrieves, but does not remove, the first element of this deque, or
         * returns null if this deque is empty.
         **/
        public E peekFirst()
        {
            return arrayDeque.peekFirst();
        }
    
        /**
         * Retrieves, but does not remove, the last element of this deque, or
         * returns null if this deque is empty.
         **/
        public E peekLast()
        {
            return arrayDeque.peekLast();
        }
    
        public static void main(String... arg)
        {
            QueueImpl<Integer> arrayDeque = new QueueImpl<Integer>();
            arrayDeque.add(300);
            arrayDeque.add(200);
            arrayDeque.add(600);
            arrayDeque.add(-400);
            arrayDeque.add(240);
    
            System.out.println("the elements of the arrayDeque is ");
            Iterator<Integer> itr = arrayDeque.iterator();
            while (itr.hasNext())
            {
                System.out.print(itr.next() + "\t");
            }
            System.out.println();
            arrayDeque.offer(600);
            arrayDeque.offer(700);
            arrayDeque.offerFirst(3);
            arrayDeque.offerLast(10);
    
            System.out.println("the peak element of the arrayDeque is(by peeking) " + arrayDeque.peek());
            System.out.println("the peak element of the arrayDeque is(by polling) " + arrayDeque.poll());
            System.out.println("the last element of arrayDeque is (peeking)" + arrayDeque.peekLast());
            System.out.println("element 300 removed " + arrayDeque.remove(300));
            System.out.println("the arrayDeque contains 400 :" + arrayDeque.contains(400));
            System.out.println("the arrayDeque contains 600 :" + arrayDeque.contains(600));
            System.out.println("the size of the arrayDeque is " + arrayDeque.size());
            System.out.println(arrayDeque);
        }
    }
    

    结果:

    the elements of the arrayDeque is 
    300 200 600 -400    240 
    the peak element of the arrayDeque is(by peeking) 3
    the peak element of the arrayDeque is(by polling) 3
    the last element of arrayDeque is (peeking)10
    element 300 removed true
    the arrayDeque contains 400 :false
    the arrayDeque contains 600 :true
    the size of the arrayDeque is 7
    [200, 600, -400, 240, 600, 700, 10]
    

    【讨论】:

      猜你喜欢
      • 2015-05-04
      • 2013-03-06
      • 1970-01-01
      • 2011-04-27
      • 2014-12-22
      • 2013-08-21
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      相关资源
      最近更新 更多