我方法的目的是将2个排序的队列合并到一个较大的字母A-Z的排序队列中并返回它。我的方法在大多数情况下都有效(即返回AZ),但是有时它遗漏了字母Y,Z,或者有时只是丢失了我返回队列中的字母Z本身。这是我所说的例子。q1和q2的
示例将在结果队列中生成缺失的Y和Z。
q1是包含(ACEHIJKMNPQRSTUXYZ)
的字符串队列q2是包含(BDFGLOVW)的字符串队列
这2个参数传递到我的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调试此代码上方的代码来找出问题,以查看初始的while循环后q1和q2是否为空。在这种情况下,初始的while循环结束后q1不为空。因此,我知道问题出在我的条件语句中,但不确定在哪里。我的逻辑有点偏离。
但是我只是不明白这段代码上面的实现是如何省略Y和Z的,因为循环一直持续到q1和q2都为空。如果Y和Z没有排队到q3,则意味着q1仍然保留Y和Z,并且显然不为空,并且代码应继续运行直到q1为空。
有人可以解释q1是如何使Y和Z不进入q3的吗?以及如何使用比我发现的解决方案更有效的编码来修复它。
while
循环的条件是!q1.isEmpty() && !q2.isEmpty()
-即两个队列都不能为空。这是一个正确的条件,因为循环主体会窥视两个队列,并且如果其中一个队列为空则将失败。但是,如果一个队列中的所有元素都小于另一个队列中的某些元素,则循环终止后,这些元素将留在另一个队列中。但是,由于在每次迭代中仅从一个队列中删除一个元素,所以其中一个队列将在另一个队列之前排空。因此,在循环之后,恰好一个队列将为空,而另一个队列将不会为空。
因此,最后的操作必须是将所有元素从非空队列移入结果队列。由于您知道只有一个队列将是空的,因此通过添加两个队列中的所有元素来做到这一点是安全的,因为添加空队列中的所有元素均无效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句