如何在优先级队列中使用对,然后 return 使用键作为优先级的值

How to use pair in a priority queue and then return the value using the key as the priority

所以我想使用最小的键作为优先级,然后 return 该对应键的 VALUE:

import javafx.util.Pair;
import java.util.PriorityQueue;

public class Test
{
    public static void main (String[] args)
    {
        int n = 5;

        PriorityQueue <Pair <Integer,Integer> > l = new PriorityQueue <Pair <Integer,Integer> > (n);

        l.add(new Pair <> (1, 90));
        l.add(new Pair <> (7, 54));
        l.add(new Pair <> (2, 99));
        l.add(new Pair <> (4, 88));
        l.add(new Pair <> (9, 89));

        System.out.println(l.poll().getValue()); 
    }
}

我要查找的输出是 90,因为 1 是最小的键。即使值被用作优先级并且键被 returned 也很好,因为如果需要我可以交换数据。我想使用 value/key 作为优先级显示 key/value(在本例中为最小值)。我不知道在这种情况下如何做到这一点。这在 C++ 中工作正常。

您需要使用 Comparator 来排序这个优先级队列。

在创建PriorityQueue

时使用Comparator.comparing()并传递比较参数Method reference
PriorityQueue<Pair<Integer,Integer> > pq=
                new PriorityQueue<Pair<Integer,Integer>>(n, Comparator.comparing(Pair::getKey));

你可以使用 lambda 表达式

PriorityQueue<Pair<Integer,Integer> > pq=
                    new PriorityQueue<Pair<Integer,Integer>>(n,(a,b) -> a.getKey() - b.getKey());

或者,使用实现 Comparable.

的自定义 Pair class
class Pair implements Comparable<Pair> {
    Integer value;
    Integer index;

    public Pair(Integer value, Integer index) {
        this.value = value;
        this.index = index;
    }

    @Override
    public int compareTo(Pair o) {
        return value - o.value;
    }
}

然后是用法

// Add elements
queue.add(new Pair(valueKey, index));
// do it for all your elements

final Pair min = queue.poll();
Integer index = min.index;
Integer value = min.value;

// Do with them what you want.

我在 leetcode 挑战中使用了 PriorityQueue。 https://leetcode.com/problems/merge-k-sorted-lists/discuss/630580/Using-PriorityQueue-in-Java

这是完整的例子 https://github.com/yan-khonski-it/leetcode/blob/master/src/main/java/com/yk/training/leetcode/merge_sorted_lists/PriorityQueueSolution.java

在大多数情况下我更喜欢使用 Map.Entry 来达到这个目的。其他时候在 PriorityQueue 构造函数中使用 Comparator 自定义 Pair class。

import java.util.PriorityQueue;
import java.util.Map;
import java.util.HashMap;

public class Test
{
    public static void main (String[] args)
    {
        int n = 5;

        PriorityQueue <Map.Entry<Integer,Integer>> l = new PriorityQueue <> (n,(a,b)->Integer.compare(a.getKey(),b.getKey()));
        Map<Integer,Integer> map = new HashMap<>();
        map.put(1,90);
        map.put(7,54);
        map.put(2,99);
        map.put(4,88);
        map.put(9,89);
        l.addAll(map.entrySet());
        System.out.println(l.poll().getValue()); 
    }
}