我的方法的目的是将2个排序的队列合并到一个更大的字母A - Z的排序队列中并返回它。我的方法在很大程度上起作用(即返回A-Z)但是有时它会错过字母Y,Z或有时只是字母Z本身在我的返回队列中。这是我所说的一个例子。
q1和q2的示例将在结果队列中产生缺少的Y和Z.
q1是包含(A C E H I J K M N P Q R S T U X Y Z)字符串的队列
q2是包含(B D F G L O V W)
的字符串队列
这两个参数传递给我的merge方法。
private static Queue<Comparable> merge(Queue<Comparable> q1,
Queue<Comparable> q2) {
Queue<Comparable> q3 = new Queue<Comparable>();
while (!q1.isEmpty() && !q2.isEmpty()){
if (less(q1.peek(),q2.peek())) q3.enqueue(q1.dequeue());
else if (less(q2.peek(),q1.peek())) q3.enqueue(q2.dequeue());
if (q1.isEmpty() && !q2.isEmpty()) q3.enqueue(q2.dequeue());
else if (q2.isEmpty() && !q1.isEmpty()) q3.enqueue(q1.dequeue());
}
//while (!q1.isEmpty()) q3.enqueue(q1.dequeue());
//while (!q2.isEmpty()) q3.enqueue(q2.dequeue());
return q3;
}
我已尝试解决此问题的方法是
while (!q1.isEmpty()) q3.enqueue(q1.dequeue());
while (!q2.isEmpty()) q3.enqueue(q2.dequeue());
它解决了!但是我对这个解决方案不满意。我通过调试System.out.println来解决这个问题,看看q1和q2在初始while循环后是否为空。在这种情况下,在初始while循环结束后q1不为空。所以我知道问题出在我的条件语句中,但不知道在哪里。我的逻辑有点偏。
但我只是不明白这个代码上面的实现如何省略Y和Z,因为循环一直持续到q1和q2都为空。如果Y和Z没有排入q3那么这意味着q1仍然保持Y和Z并且明显不为空并且代码应该继续运行直到q1为空。
有人可以解释q1怎么没有将Y和Z排入q3?怎么做 我使用比我找到的解决方案更有效的编码来修复它。
答案 0 :(得分:0)
while
循环的条件是!q1.isEmpty() && !q2.isEmpty()
- 也就是说,两个队列都不能为空。这是一个正确的条件,因为循环体会窥视两个队列,如果任一队列为空,则会失败。但是,如果一个队列中的所有元素都小于另一个队列的某些元素,则在循环终止后,这些元素将保留在另一个队列中。但是,由于您只在每次迭代中从其中一个队列中删除一个元素,因此其中一个队列将在另一个队列之前清空。所以在循环之后,恰好一个队列将为空而另一个队列将不会。
因此,最后的操作必须是将所有元素从非空队列移动到结果队列中。既然你知道一个队列只有一个空,那么通过添加两个队列中的所有元素来做到这一点是安全的,因为添加空队列的所有元素都没有效果。