使用 (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] 基本原因是你不能保证&lt;在进行排序时会比较你想要的方式,所以你需要提供代码。 @DownloadPizza - 它不一定有效。如果ab 是(比如说)int 并且值可以是任何整数,那么这个实现可能会给出错误的答案。 @StephenC 你说得对,我忘了java默认不检查下溢 【参考方案1】:

lambda (a,b) -&gt; a-b目标是产生一个满足Comparator 合约的数字:

如果a 小于b - 返回否定结果 如果a 等于b - 返回零 如果a 大于b - 返回肯定结果。

Comparator 返回的值被 sort 用来比较集合中的元素对(数字)来决定哪个更大。

问题a - b不适用于Java整数类型1。在某些情况下,a - b 会溢出,您将得到带有错误符号的结果。例如,如果aInteger.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) -&gt; a.compareTo(b)。或致电Compator.naturalOrder() 生成Comparator&lt;String&gt;。没有静态的 String.compare(String,String) 方法,所以 String::compare 不是一个选项。 @StephenC 感谢您的解释。现在我清楚地明白了这一点。 好吧,String::compareTo 会起作用,但无论如何为具有自然顺序的类型实现新的Comparator 是没有意义的。只需使用new PriorityQueue&lt;&gt;() resp。 Collections.sort(list);String。这同样适用于PriorityQueue&lt;Integer&gt;;只需使用默认构造函数。对于没有自然顺序的类型(例如 int[]),或者当您想要与自然顺序不同的顺序时,您只需要 Comparator

以上是关于使用 (a,b) -> a-b lambda 函数 java的主要内容,如果未能解决你的问题,请参考以下文章

Python 输入两个整数a和b,求a-b的绝对值?

Python两个变量的值进行交换的方法

Neon 指令,vsub_f32(a, b),是 a-b 还是 b-a?

静态链表实现 (A-B)U(B-A)

L1-011. A-B

L1-011 A-B