首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有lamda表达的PriorityQueue<Integer>

具有lamda表达的PriorityQueue<Integer>
EN

Stack Overflow用户
提问于 2020-10-08 23:50:54
回答 2查看 1.8K关注 0票数 2

我试图了解如何在Java中使用堆来处理lambda函数。下面的函数是创建一个最大堆

代码语言:javascript
运行
复制
PriorityQueue<Integer> pq = new PriorityQueue<>((x, y) -> y - x);

有人能告诉我(x, y) -> y - x)是干什么的吗?Im告诉我,“lambda函数将两个整数作为输入参数,互相减除,并返回算术结果。”

所以如果我做了

代码语言:javascript
运行
复制
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)?

EN

回答 2

Stack Overflow用户

发布于 2020-10-09 00:05:44

9-5=4优先级 of 9pq.peek()返回不是优先级

new PriorityQueue<>(comparator);使用(x, y) -> y - x来比较和确定下一个应该查看的值。

所以9-5=4大于5-9=-4

因此,值9将是第一个。

票数 3
EN

Stack Overflow用户

发布于 2020-10-09 00:31:14

我试图了解如何在Java中使用堆来处理lambda函数。

Lambda表达堆数据结构本身没有任何关系。

  • Lambda表达式-是一种语言特性,充当匿名函数,您可以使用/传递它作为一个值;
  • 堆-是一种数据结构,最初在数学中定义,现在在计算机科学领域被大量使用。

有人能告诉我(x,y) -> y-x做什么吗?

这就是您的比较器,即实现Comparator<T>的lambda表达式,并将其作为参数传递到优先级队列构造函数中。

然后,PriorityQueue<T>使用该比较器,并利用int compare(T o1, T o2)方法,每次从它获取一个元素时(轮询/peek)。

PriorityQueue<T> 依赖于一份合同

int比较(T o1,T o2)比较它的两个参数的顺序。返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个参数。

所以,在你的代码中:

代码语言:javascript
运行
复制
PriorityQueue<Integer> pq = new PriorityQueue<>((x, y) -> y - x);
pq.add(9);
pq.add(5);
System.out.println(pq.peek());

两个数字在堆/PQ中排队,当您将.peek()95分别传递到xy时。返回9-5>0 true时。

输出是9,因为它是一个最大堆,但是我不应该获得4作为输出,因为(9-5=4)?

9-5=4只与比较器相关,以决定两个元素的比较结果是0,正数还是负数,正如前面已经解释过的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64272125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档