需要Java优先级队列帮助

时间:2011-05-16 04:20:04

标签: java priority-queue

我正在处理一个旅行商问题而且我的p-queue没有运行它只是添加了最后一项。我很想知道是否有人能帮助我找出错误。这是我的Node类(添加到队列中的节点):

import java.util.*; 

public class Node implements Comparable< Node >{

    //level of node
    int level;
    //stores path of node
    ArrayList< Integer > path = new ArrayList< Integer >();
    //bound of node
    int bound;

    /** Over-rides compareTo for priority queue handling
       * @return int desired sorting value
       */
    public int compareTo(Node aNode) 
    {               
      if (this.bound<aNode.bound)
      {
          return 1;
      }
      if (this.bound>aNode.bound)
      {
          return -1;
      }
      else
      {
          return 0;
      }
    }
}

这是p-queue实现:

PriorityQueue< Node > theQ = new PriorityQueue< Node >();

算法正确实现,p队列根本没有将最低边界作为头部。我甚至颠倒了compareTo上的返回,对p队列输出没有影响(告诉我队列没有排序。我浪费了几个小时试图找出它并且也问了一些同学(没有人能看出来)问题)在这里拍摄,看看是否有人知道为什么队列是这样的..

2 个答案:

答案 0 :(得分:3)

您的代码对我来说非常好。

我怀疑你正在做的是改变单个对象的bound值并重复添加它,给你一个完整相同对象的队列(很多引用它)当然有您设置的单个(最后)值。

public static void main(String[] args)
{
    PriorityQueue< Node > theQ = new PriorityQueue< Node >();
    Node n = new Node();
    n.bound = 6;
    theQ.add(n);
    n = new Node();
    n.bound = 9;
    theQ.add(n);
    n = new Node();
    n.bound = 4;
    theQ.add(n);
    while ((n = theQ.poll()) != null)
        System.out.println("Bound = " + n.bound);
}

输出:

  

界限= 9
  界限= 6
  Bound = 4

答案 1 :(得分:2)

确保使用PriorityQueue接口提供的方法迭代Queue,例如。 remove从顶部弹出一个元素。在伪代码中:

for each element in some other collection
  priorityQueue.add(element)

while priorityQueue is not empty
 Set node to priorityQueue.remove()
 Do stuff with node

如果您尝试迭代for-each循环或PriorityQueue.iterator:

  

迭代器提供方法   iterator()不保证   遍历优先级的元素   按任何特定顺序排队。

或者,如果您不想销毁/删除PriorityQueue中的元素以按顺序迭代,您可以使用,如文档所示,

  Arrays.sort(pq.toArray())