使用 (a,b) -> a-b lambda 函数 java
Posted
技术标签:
【中文标题】使用 (a,b) -> a-b lambda 函数 java【英文标题】:use of (a,b) -> a-b lambda function java 【发布时间】:2021-11-10 04:57:50 【问题描述】:hlo 我总是很困惑为什么我们使用 (a,b) -> a-b 进行排序。
例子-
Collections.sort(list, (a, b) -> return (a[1] - b[1]); );
PriorityQueue MaxHeap = new PriorityQueue((a,b) -> a-b);
我真的很困惑,我试图通过调试代码来理解这个语句的流程。
ArrayList<int[]> list = new ArrayList<>();
for (int i = 0; i < n; i++)
list.add(new int[] start[i], end[i] );
Collections.sort(list, (a, b) ->
return (a[1] - b[1]);
);
int count = 1;
int[] x = list.get(0);
for (int i = 1; i < list.size(); i++)
int[] res = list.get(i);
if (x[1] < res[0])
count += 1;
x = res;
return count;
如果有人有更好的方法来理解这一点,请帮助我。
【问题讨论】:
a - b 为您提供有效的比较结果。 0 -> 相等,正 -> a > b,负 -> a 如果a[1] - b[1]
小于0,则表示a[1]
小于b[1]
;同样,如果a[1] - b[1]
大于0,则意味着a[1]
大于b[1]
;如果a[1] - b[1]
为0,则表示a[1]
等于b[1]
基本原因是你不能保证<
在进行排序时会比较你想要的方式,所以你需要提供代码。
@DownloadPizza - 它不一定有效。如果a
和b
是(比如说)int
并且值可以是任何整数,那么这个实现可能会给出错误的答案。
@StephenC 你说得对,我忘了java默认不检查下溢
【参考方案1】:
lambda (a,b) -> a-b
的目标是产生一个满足Comparator
合约的数字:
a
小于b
- 返回否定结果
如果a
等于b
- 返回零
如果a
大于b
- 返回肯定结果。
Comparator
返回的值被 sort
用来比较集合中的元素对(数字)来决定哪个更大。
问题是a - b
不适用于Java整数类型1。在某些情况下,a - b
会溢出,您将得到带有错误符号的结果。例如,如果a
是Integer.MIN_VALUE
并且b
是一个正整数,那么a - b
应该是负数时会是正数。
(这是一个相当常见的错误,即使是相对有经验的程序员也会犯……尽管希望只有一次。)
相比之下,Integer.compare(int, int)
方法为所有可能的参数给出了正确的答案……。所以更好(即更正确)的解决方案是:
Collections.sort(list, (a, b) -> Integer.compare(a[1], b[1]));
PriorityQueue<Integer> MaxHeap = new PriorityQueue<>(Integer::compare);
1 - 事实上,对于溢出不会触发某种异常的任何整数类型。而对于浮点类型,有不同的陷阱。
【讨论】:
始终使用包装类中对应的比较方法进行比较。 Integer.compare 或 Long.compare 等 所以对于字符串比较我可以用来排序。在那种情况下,我可以使用 compareTo 或什么方法。 您可以使用(a, b) -> a.compareTo(b)
。或致电Compator.naturalOrder()
生成Comparator<String>
。没有静态的 String.compare(String,String)
方法,所以 String::compare
不是一个选项。
@StephenC 感谢您的解释。现在我清楚地明白了这一点。
好吧,String::compareTo
会起作用,但无论如何为具有自然顺序的类型实现新的Comparator
是没有意义的。只需使用new PriorityQueue<>()
resp。 Collections.sort(list);
为 String
。这同样适用于PriorityQueue<Integer>
;只需使用默认构造函数。对于没有自然顺序的类型(例如 int[]
),或者当您想要与自然顺序不同的顺序时,您只需要 Comparator
。以上是关于使用 (a,b) -> a-b lambda 函数 java的主要内容,如果未能解决你的问题,请参考以下文章