Double.compare(a[0],b[0]))是如何工作的



我想对2D阵列进行排序

int[][] a1 = new int[][2];

内容为

6, 8
5, 7
1, 3
2, 4

我的预期输出是:

1, 3
2, 4
5, 7
6, 8

我发现我们可以使用Double.compare((方法作为,

Arrays.sort(a1,(a,b)->Double.compare(a[0],b[0]));

这确实按照我的意愿对数组进行了排序,但我不知道它是如何工作的?有人能解释吗

Arrays.sort(collection, oracle)是您在此使用的API。集合是(thingies(的列表,oracle是代码(不是值,它是代码,或者至少是指向代码的值(。神谕可以决定两件事中的哪一件在另一件之前排序。

给定一个神谕,它可以告诉你任何2个(事物(哪个"在之前",以及一个(事物的(集合,你可以有效地对它进行排序。怎样好吧,各种算法——重点是,Arrays.sort就是这种算法,就像你可以在不知道内燃机如何工作的情况下驾驶汽车一样,你可以在知道这些细节的情况下使用Arrays.sort。如果你想知道java的库是开源的,你可以看看。

那么,这里发生了什么?

你的列表(a1(是一个(事物(列表。这里是int[]。毕竟,您有一个int[][],它不是"2D int数组"(在java中不存在(。它是一个int数组的数组。(您可以简单地使用它来模拟2D int数组,所以这很好(。因此,当您尝试将类型为int[][]的变量传递给Arrays.sort时,您已经传递了一个int[]的数组(好吧,它们的数组(。

因此,oracle需要决定2个int数组中哪一个是"较早的"。

它就是这样做的:(a, b)是两个int数组,然后代码通过查看它们的第一个值(a[0]b[0](,然后将它们交给Double.compare方法,来决定这两个数组中哪一个"早"。。比较2的方式是你想象的两倍(5是8.2之前的,因为,嗯,它是(。

为什么选择Double?没有理由,没有想法。CCD_ 14将使得代码更加高效和可读;所有的int都可以无损耗地转换为double,因此Double.compare(someInt, someOtherInt)总是返回与Integer.compare(someInt, someOtherInt)完全相同的东西。它只是可读性较差,效率较低。

最新更新