【问题标题】:Error reversing queue in recursive Java method递归Java方法中的错误反转队列
【发布时间】:2016-02-28 14:43:20
【问题描述】:

我正在尝试编写一个 recursive 方法来反转队列中的所有元素。

在实现Queue接口的抽象类myQueue中是我的reverse方法:

public void reverse() {
  T temp = dequeue();
  Queue<T> bufferQueue = new Queue<T>();

  if(!(temp == null)){
    bufferQueue.enqueue(temp);
  }

  if(!(isEmpty())) {
    reverse();
  }else{
    while(!(bufferQueue.isEmpty())){
       Queue.enqueue(bufferQueue.dequeue);
    }
  }

}

接口Queue具有以下方法,这些方法是完整的(并且按照定义隐式执行):

public boolean isEmpty();
public int size();
public void enqueue(T e);
public T dequeue();
public T front();

我的目标:

在我的reverse 方法 中,我的目标是不断地dequeue(删除第一个元素)从我的原始队列中递归直到我的队列为空。每次我出队时,我都会将该对象放入 临时 队列中。当我的队列为空时,我会从 临时队列 入队 回到我原来的队列。

我的第一个问题是定义一个新的临时队列,在我的例子中是 bufferQueue。我得到以下信息:

1. ERROR at solution.java (at line 12)
Queue<T> bufferQueue = new Queue<T>();
                           ^^^^^
Cannot instantiate the type Queue<T>

【问题讨论】:

  • Queue是一个接口,你需要实例化一个Queue的具体实现

标签: java recursion queue reverse


【解决方案1】:

Queue 是一个接口。您不能创建接口的实例。 检查 Queue 的 JavaDoc 并选择一个实现 Queue 的类:

https://docs.oracle.com/javase/7/docs/api/java/util/Queue.html

您要完成的工作非常简单,根本不需要递归,只需要具体类上的可用方法,例如ArrayDeque + 您的自定义反向方法。此外,您不需要中间的bufferQueue。这应该很好用:

public class MyQueue<T> extends ArrayDeque<T>{
    public void reverse() {
      T[] contents = toArray(T[]);
      clear();

      if(contents != null){
        for(int i = contents.length-1; i >= 0; i--){
            add(contents[i]);
        }
      }
  }
}

【讨论】:

  • 你是对的。我是否朝着定义递归的正确方向前进?
  • 我认为你最好扩展一个具体的 Queue 类,这样你就可以简单地添加 reverse() 方法,而不必在 Queue 接口中实现多个抽象方法
  • 另外,调用poll() 方法而不是dequeue()。不确定dequeue() 方法的来源。这是自定义方法吗?
【解决方案2】:

你需要有一个具体的类型而不是 T,T 在实例化时是不可能的。

【讨论】:

  • 是的。 T 在这种情况下是泛型类型。在T temp = dequeue(); 工作之前的行中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
相关资源
最近更新 更多