2015-06-19 83 views
0

当我尝试从ArrayQueue>变量类型出队到ArrayQueue并将其作为参数传递给另一个方法时,我遇到了一些问题。Java ArrayQueue入队和出队抛出arrayQueueException

所以基本上我有两个方法,一个是sort()而没有参数,另一个是merge(),它需要2个ArrayQueue参数。

我有一个全局变量称为队列:

private ArrayQueue<ArrayQueue<E>> Queue; 

我的排序(),我出列从队列前两个项目,并通过他们合并()作为参数内:

public void sort() { 
    while (Queue.size() >= 2) { 
     ArrayQueue<E> first = Q.dequeue(); 
     ArrayQueue<E> second = Q.dequeue(); 
     System.out.print("1st" + firstElement); 
     System.out.print("2nd" + secondElement); 
     merge(first,second) 
    } 
} 

public E dequeue() throws ArrayQueueException { 
    if (isEmpty() == true) 
     throw new ArrayQueueException("Queue error"); 
    if (front == rear) { 
     front = front - 1; 
     rear = rear - 1; 
    } else 
     front = front + 1; 
    size--; 
    return Q[front]; 
} 

然后我的合并内:

private ArrayQueue<E> merge(ArrayQueue<E> q1, ArrayQueue<E> q2) throws ArrayQueueException { 
    System.out.println("q1 is " + q1.toString()); 
    ArrayQueue<E> merged = new ArrayQueue<E>(); 
    String e1 = (String) q1.dequeue(); 
    System.out.println("e1 is " + e1); 
    String e2 = (String) q2.dequeue(); 

    merged.enqueue(q2.dequeue()); 
      if (q2.isEmpty()) { 
       // add remaining q1 elements 
       while (!q1.isEmpty()) { 
        merged.enqueue(q1.dequeue()); 
       } 
       break; 
      } 
      // take another element from q2 
      e2 = (String) q2.dequeue(); 
} 

而且我从控制台得到的输出为:

1st[the]2nd[ragged]q1 is [the] 
e1 is null 
Exception in thread "main" ArrayQueueException: Queue error 
at ArrayQueue.dequeue(ArrayQueue.java:84) 
at QueueSort.merge(QueueSort.java:41) 
at QueueSort.sort(QueueSort.java:73) 
at QueueSort.main(QueueSort.java:122) 

QueueSort.java:41是这一行:merged.enqueue(q2.dequeue());我不知道为什么它不会出队。

另外,我不知道为什么e1变为空,因为我试图执行一个出队并将其转换为字符串。我在后面的部分需要这个字符串。 任何想法?提前致谢。

+0

'ArrayQueue'不是一般的JDK实用程序类。它实际上来自'com.sun.jmx.remote.internal'包,因此没有记录,不应该被客户端代码使用。这里的正确类可能是['ArrayDeque'](http://docs.oracle.com/javase/8/docs/api/java/util/ArrayDeque.html)(或'LinkedList',无论你喜欢什么) –

+0

@ Slanec这实际上是一项任务,我们必须遵循他们所说的话。你有什么想法如何根据上述标准来解决它?因为merge()的ArrayQueue参数只包含一个字符串,所以我一直在考虑是否有可能将它从参数中退出,并像上面的代码一样返回到另一个队列中?我在想是不是因为那部分导致了问题? – hyperfkcb

+0

@Slanec你有什么想法吗? – hyperfkcb

回答

1

主要问题似乎是您的出列功能。它总是返回isEmpty()。我会检查isempty()并在你到达该点之前检查大小。在尝试出列之前,我没有看到任何项目入队到ArrayQueue。你有可能设置了你的q1和q2,但是你没有在这些项目上放置任何东西,所以它不会返回任何东西。

一个可能的问题是您的队列的变量名称。队列是一个接口,在将它传递给出队之前,事情可能会变得混乱。您应该将队列的名称更改为队列或更明确的内容。最好总是有变量开始小写。

此外,对于样式,在您的出列函数中,如果您从中返回布尔值,则不需要将isEmpty()与true进行比较。它只是看起来像:

if (isEmpty()) 

的的isEmpty()函数解析为真或假,if语句作用于该值。

我希望这会有所帮助。

+0

好吧,但我意识到现在的问题是让我们说我的q1包含[the]和q2包含[你好]。但是当我需要将这两个添加到另一个名为merged的ArrayQueue时。将它们添加到合并的唯一方法是排队。但为了排队,我需要q1和q2先出队。但是,再次,因为q1和q2只有1个项目,这就是为什么当出列它运行到isEmpty – hyperfkcb

+0

不应该q1和q2能够为空?当他们出列单个项目时,它应该正确地出列。你应该可以在你的入队中使用它。看起来你的isEmpty()函数在只有一个项目时可能会返回true。 –