【问题标题】:Java Queue Merge, BeginnerJava 队列合并,初学者
【发布时间】:2009-11-19 01:52:25
【问题描述】:

我正在尝试编写一个方法,该方法将接收两个队列(预排序的链接列表)并按升序返回合并后的 Queue 对象。我粘贴了 Queue 类,merge 方法 开始向下 1/2。

我在调用合并时遇到问题,这就是我试图从我的 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;
 }}

【问题讨论】:

    标签: java list queue linked-list


    【解决方案1】:

    这里似乎是一个错误:

    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);
    

    但是,由于合并似乎没有副作用并且不会改变 Queue 实例的任何状态,您可能只想将此方法设为静态,以便它属于 Queueclass 而不是队列的一个实例。例如:

    static Queue merge(Queue q1, Queue q2) {
         ...
    }
    
    //in main()...
    Queue merged = Queue.merge(new1, new2);
    

    【讨论】:

      【解决方案2】:

      将两个排序的迭代器合并到另一个迭代器的简单方法:

      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");
              }
          };
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-12
        • 2010-09-15
        • 2021-01-01
        • 1970-01-01
        • 2010-09-17
        • 2015-08-17
        • 2015-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多