我正在尝试编写一个方法,该方法将接受两个队列(预先排序的链接列表)并按升序返回合并,从而生成Queue对象。我粘贴了队列类,合并方法以1/2向下开始。
我在调用merge时遇到问题,这就是我试图通过 main方法调用它的方式,任何人都可以使用new1和new2来帮助调用它。非常感谢大家!
如果有人注意到其他不合适的地方,请告诉我。谢谢!
///////////////// //Testing with a call of merge method & 2 Queues///////////////////
public class test {
public static void main (String args[]){
Queue new1 = new Queue();
new1.enqueu(1);
new1.enqueu(3);
new1.enqueu(5);
Queue new2 = new Queue();
new1.enqueu(2);
new1.enqueu(4);
new1.enqueu(6);
merge(new1, new2);
//How to call merge? Queue.merge(new1, new2)???
/////////////////Queue/Merge method below////////////////////////
public class Queue {
private Node first, last;
public Queue(){
first = null;
last = null;
}
public void enqueu(int n){
Node newNode = new Node(n);
if (first == null)
{
first = newNode;
last = newNode;
}
else
{
last.setNext(newNode);
last = newNode;
}
}
public int dequeue(){
int num = first.getNum();
first = first.getNext();
if(first == null)
last = null;
return num;
}
public Boolean isEmpty() { return first == null; }
////////////////////////Begin Queue merge/////////////////////////////////
Queue merge(Queue q1, Queue q2) {
Queue result = new Queue();
boolean q1empty = q1.isEmpty();
boolean q2empty = q2.isEmpty();
while (!(q1empty || q2empty)) {
if (q1.first.getNum() < q2.first.getNum()) {
result.enqueu(q1.dequeue());
q1empty = q1.isEmpty();
} else {
result.enqueu(q2.dequeue());
q2empty = q2.isEmpty();
}
}
if (!q1empty) {
do {
result.enqueu(q1.dequeue());
} while (!q1.isEmpty());
} else if (!q2empty) {
do {
result.enqueu(q2.dequeue());
} while (!q2.isEmpty());
}
return result;
}}
答案 0 :(得分:3)
这里有一个似乎是错误的内容:
Queue new1 = new Queue();
new1.enqueu(1);
new1.enqueu(3);
new1.enqueu(5);
Queue new2 = new Queue();
new1.enqueu(2);
new1.enqueu(4);
new1.enqueu(6);
您已向new1
添加了六个元素,向new2
添加了零。
由于merge
方法是Queue
类的实例方法,因此需要在Queue实例上调用它,例如
Queue q = new Queue();
Queue merged = q.merge(new1, new2);
但是,由于merge似乎没有副作用且不会改变Queue实例的任何状态,您可能只想将此方法设为静态,以便它属于Queue 类而不是队列的一个实例。例如:
static Queue merge(Queue q1, Queue q2) {
...
}
//in main()...
Queue merged = Queue.merge(new1, new2);
答案 1 :(得分:0)
将两个已排序的迭代器合并到另一个迭代器中的简单方法:
public static Iterator<Object> merge(final Iterator<Object> it1,
final Iterator<Object> it2, final Comparator<Object> comp) {
return new Iterator<Object>() {
private Object o1 = it1.hasNext() ? it1.next() : null, o2 = it2
.hasNext() ? it2.next() : null;
@Override
public boolean hasNext() {
return o1 != null || o2 != null;
}
@Override
public Object next() {
if (o1 == null && o2 == null)
throw new NoSuchElementException();
Object ret;
if (o1 == null) {
ret = o2;
o2 = it2.hasNext() ? it2.next() : null;
} else if (o2 == null) {
ret = o1;
o1 = it1.hasNext() ? it1.next() : null;
} else {
if (comp.compare(o1, o2) <= 0) {
ret = o1;
o1 = it1.hasNext() ? it1.next() : null;
} else {
ret = o2;
o2 = it2.hasNext() ? it2.next() : null;
}
}
return ret;
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not implemented");
}
};
}