【问题标题】:How Double.compare(a[0],b[0])) works?Double.compare(a[0],b[0])) 如何工作?
【发布时间】:2022-01-26 13:46:26
【问题描述】:

我想对二维数组进行排序

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() "根据指定的比较器产生的顺序对指定的对象数组进行排序。"
  • 应该使用Integer.compare(),因为你在比较整数,而不是双精度......
  • 你也可以像这样使用Comparator.comparingIntArrays.sort(a1, Comparator.comparingInt(arr -> arr[0]));

标签: java arrays


【解决方案1】:

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

给定一个预言机,它可以告诉您任何 2 个(事物)哪个“先于”,以及一个(事物)的集合,您可以有效地对其进行排序。如何?嗯,各种算法 - 重点是,Arrays.sort 就是那个算法,就像你可以在不知道内燃机如何工作的情况下驾驶汽车一样,你可以在不知道这些细节的情况下使用 Arrays.sort。如果你想知道——java的库是开源的,你可以看看。

那么,这里发生了什么?

您的列表 (a1) 是 (thingies) 的列表。 (thingies) 这里是 int[]。毕竟,你有一个int[][],它不是一个“二维 int 数组”(在 java 中不存在)。它是一个 int 数组的数组。 (您可以轻松地使用它来模拟 2D int 数组,这很好)。因此,当您尝试将 int[][] 类型的变量传递给 Arrays.sort 时,您已经传递了 int[] 的数组(嗯,它们的数组)。

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

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

为什么是Double?没有理由,没有想法。 Integer 将提高代码的效率和可读性;所有int 都可以无损失地转换为double,因此Double.compare(someInt, someOtherInt) 总是返回与Integer.compare(someInt, someOtherInt) 完全相同的内容。它只是可读性较差,效率较低。

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 2016-06-02
    • 2021-11-19
    • 1970-01-01
    • 2017-01-21
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    相关资源
    最近更新 更多