0

有没有办法让这个方法更快地排队?我正在尝试为此方法添加性能测试,并想知道是否有替代方法。

  import java.util.ArrayList;
  import java.util.List;
  import java.util.NoSuchElementException;

  public class ImmutableQueueImpl<E> implements ImmutableQueue<E> {
      private     List<E> queue;
      public ImmutableQueueImpl() { 
        queue = new ArrayList<E>();
      }

      private ImmutableQueueImpl(List<E> queue) {
        this.queue = queue; }

      @Override
      public ImmutableQueue<E> enqueue(E e) {
        if (e == null) {
         throw new IllegalArgumentException();
        }
        List<E> clone = new ArrayList<E>(queue); clone.add(e);
        return new ImmutableQueueImpl<E>(clone);
      }

      @Override
      public ImmutableQueue<E> dequeue() {
         if (queue.isEmpty()) {
            throw new NoSuchElementException();
         }
         List<E> clone = new ArrayList<E>(queue); 
         clone.remove(0);
         return new ImmutableQueueImpl<E>(clone);
      }

      @Override 
      public E peek() {
        if (queue.isEmpty()) {
          throw new NoSuchElementException();
        }
        return queue.get(0); 
      }

     @Override 
     public int size() {
      return queue.size();
     }
    }

编辑 我添加了完整的代码以供参考。希望有帮助

4

1 回答 1

0

在内部使用 2 个不可变列表,可以在不可变队列中获得 O(1) 的入队/出队操作。

这是从Scala 书中借来的代码:

class Queue[T](
  private val leading: List[T],
  private val trailing: List[T]
) {
  private def mirror =
    if (leading.isEmpty) new Queue(trailing.reverse, Nil)
    else this

  def head = mirror.leading.head

  def tail = {
    val q = mirror
    new Queue(q.leading.tail, q.trailing)
  }

  def append(x: T) = new Queue(leading, x :: trailing)
} 
于 2013-03-21T15:20:25.907 回答