问题描述
我试图了解lambda函数如何在Java中与堆一起使用。下面的功能是创建一个最大堆
PriorityQueue<Integer> pq = new PriorityQueue<>((x,y) -> y - x);
有人可以告诉我(x,y) -> y - x)
做什么吗?
我告诉我:“ lambda函数将两个Integer作为输入参数,将它们彼此相减,然后返回算术结果。”
所以我愿意
PriorityQueue<Integer> pq = new PriorityQueue<>((x,y) -> y - x);
pq.add(9);
pq.add(5);
System.out.println(pq.peek());
由于最大堆,输出为9,但由于(9-5 = 4),我不应该得到4作为输出吗?
解决方法
reading_skill
是user_id
的优先级,而fun makeAFormattedString(currencyCode: String,numberToConvert: Float): String{
val format: NumberFormat = NumberFormat.getCurrencyInstance()
format.maximumFractionDigits = 2
format.currency = Currency.getInstance(currencyCode)
return format.format(numberToConvert)
}
返回值,而不是优先级
9-5=4
使用9
进行比较并确定接下来要窥视哪个值。
所以pq.peek()
大于new PriorityQueue<>(comparator);
因此,值(x,y) -> y - x
将是第一个。
我试图了解lambda函数如何在Java中与堆一起工作。
Lambda Expression与Heap Data Structure无关,本身。
-
Lambda表达式-是一种语言功能,类似于匿名函数,您可以将其用作/传递值;
-
堆-是一种数据结构,最初在数学中定义,如今已在计算机科学领域广泛使用。
有人可以告诉我(x,y)-> y-x)吗?
这就是您的比较器,例如,一个实现Comparator<T>
的 lambda表达式,并将其作为参数传递给优先级队列构造函数。
PriorityQueue<T>
然后使用那个比较器,并在每次从中获取(轮询/窥视)元素时都使用int compare(T o1,T o2)
方法。
PriorityQueue<T>
relies on a contract,that:
int compare(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
和{ {1}}。当y
返回true时。
由于最大堆,输出为9,但由于(9-5 = 4),我不应该得到4作为输出吗?
9-5>0
仅与比较器有关,以决定两个元素的比较以0,正数还是负数结束,如上所述。