我试图了解如何在Java中使用堆来处理lambda函数。下面的函数是创建一个最大堆
PriorityQueue<Integer> pq = new PriorityQueue<>((x, y) -> y - x);有人能告诉我(x, y) -> y - x)是干什么的吗?Im告诉我,“lambda函数将两个整数作为输入参数,互相减除,并返回算术结果。”
所以如果我做了
PriorityQueue<Integer> pq = new PriorityQueue<>((x, y) -> y - x);
pq.add(9);
pq.add(5);
System.out.println(pq.peek());输出是9,因为它是一个最大堆,但是我不应该获得4作为输出,因为(9-5=4)?
发布于 2020-10-09 00:05:44
9-5=4是优先级 of 9,pq.peek()返回值,不是优先级
new PriorityQueue<>(comparator);使用(x, y) -> y - x来比较和确定下一个应该查看的值。
所以9-5=4大于5-9=-4
因此,值9将是第一个。
发布于 2020-10-09 00:31:14
我试图了解如何在Java中使用堆来处理lambda函数。
有人能告诉我(x,y) -> y-x做什么吗?
这就是您的比较器,即实现Comparator<T>的lambda表达式,并将其作为参数传递到优先级队列构造函数中。
然后,PriorityQueue<T>使用该比较器,并利用int compare(T o1, T o2)方法,每次从它获取一个元素时(轮询/peek)。
PriorityQueue<T> 依赖于一份合同
int比较(T o1,T o2)比较它的两个参数的顺序。返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个参数。
所以,在你的代码中:
PriorityQueue<Integer> pq = new PriorityQueue<>((x, y) -> y - x);
pq.add(9);
pq.add(5);
System.out.println(pq.peek());两个数字在堆/PQ中排队,当您将.peek()、9和5分别传递到x和y时。返回9-5>0 true时。
输出是9,因为它是一个最大堆,但是我不应该获得4作为输出,因为(9-5=4)?
9-5=4只与比较器相关,以决定两个元素的比较结果是0,正数还是负数,正如前面已经解释过的。
https://stackoverflow.com/questions/64272125
复制相似问题