有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java优先级队列自定义排序

我已经为我的节点优先级队列实现了一个自定义比较器,但由于某些原因,它不起作用。感谢您的帮助。如果我的节点类实现了comparable,我也会得到同样的结果

Queue<Node> queue = new PriorityQueue<>(new Comparator<Node>()
{

        public int compare(Node node1, Node node2)
        {
            if (node1.getCost() < node2.getCost())
            {
                return -1;
            }
            else if (node1.getCost() < node2.getCost())
            {
                return 1;
            }

            return 0;
        }
});

    Node node1 = new Node(initState, null,0);
    node1.setCost(20);
    Node node2 = new Node(initState, null,0);
    node2.setCost(15);
    Node node3 = new Node(initState, null,0);
    node3.setCost(10);
    Node node4 = new Node(initState, null,0);
    node4.setCost(5);
    Node node5 = new Node(initState, null,0);
    node5.setCost(4);
    Node node6 = new Node(initState, null,0);
    node6.setCost(3);

    for (Node node : queue)
    {
        System.out.println(node.getCost());
    }
   

输出

3

5

4

20

10

15


共 (2) 个答案

  1. # 1 楼答案

    您的Comparator类有一个错误。“if”和“else if”检查相同的条件。请查看下面的更正版本

    new Comparator<Node>()
    {
    
        public int compare(Node node1, Node node2)
        {
            if (node1.getCost() < node2.getCost())
            {
                return -1;
            }
            else if (node1.getCost() > node2.getCost())
            {
                return 1;
            }
    
            return 0;
        }
    }
    

    我想你熟悉比较器的概念,上面是一个打字错误。如果不是这样的话,你可以learn more on that here

  2. # 2 楼答案

    用“foreach”浏览你的收藏使用Iterator产生的PriorityQueue.iterator()

    The javadoc of this method提到

    The iterator does not return the elements in any particular order.

    你必须用另一种方法来迭代你的PriorityQueue

    以下几点应该有效:

    while(!queue.isEmpty()) {
        Node currentNode = queue.poll();
        // ...
    }