如何在优先级队列中使用对,然后 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
在大多数情况下我更喜欢使用 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());
}
}
所以我想使用最小的键作为优先级,然后 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
在大多数情况下我更喜欢使用 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());
}
}