我想知道最好的方法是编写一个方法来合并ArrayQueue和另一个Queue,而不从传递的q中删除任何元素。
eg. queue1 = [1,2,3,4] and queue2 = [5,6,7,8,9,10].
调用queue1.mergeQs(queue2)
时会创建queue1 = [1,5,2,6,3,7,4,8,9,10]
而queue2
会保留[5,6,7,8,9,10]
public void mergeQs(ArrayQmerge q){}
这种方式似乎比你传递两个队列并返回一个新的合并队列更难实现。感谢。
为了澄清,我正在寻找一种方法来交织两个队列中的元素。
答案 0 :(得分:1)
可能对您有所帮助的一个细节是,在Java中相同类的不同对象之间可以看到私有字段 。这意味着只要您打算合并自己类的队列,您的代码就可以完全访问所有内部字段,例如用于存储元素的数组。
对于最简单的情况,所有元素都存储在一个线性数组中,队列头部位于索引零处,这样的事情可能就是一个开始:
public void mergeQs(ArrayQmerge q) {
Object[] array = new Object[this.size() + q.size()];
int i;
int o;
// Interleave elements
for (i = 0, o = 0; i < this.size() && i < q.size(); ++i) {
array[o++] = this.array[i];
array[o++] = q.array[i];
}
// Copy the remaining elements
while (i < this.size()) {
array[o++] = this.array[i++];
}
while (i < q.size()) {
array[o++] = q.array[i++];
}
this.array = array;
}
答案 1 :(得分:0)
您可以在merge方法中本地创建新的Queue,然后将您的类的队列分配给本地版本。
答案 2 :(得分:0)
由于您使用的是自己的自制ArrayQueue
,因此这是猜想。
创建一个新队列并返回就像我认为你已经说过更简单,更有效,因为将元素插入到Array支持的结构中将涉及将每个插入操作的其余元素向下移动一个位置。
另一种方法是通过交换支持它的底层数组来实现public void mergeQs(ArrayQmerge q)
。因此,您可以获得与返回新队列相同的简单实现,但具有相同的副作用。