求问 java8 排序 怎么简化代码

2021-07-27 22:57:47 +08:00
 shiji
给一个 2d array: int [][]
它的子数组的长度固定为 2.
{
{1,3},
{1,4},
{2,3},
.....
}

比较的方法是先比子数组的第一个数,如果一样的话再比较第二个数字。

想知道怎么用 lambda 或者 Comparator.comparing(xxx).thenComparing(xxx) 这样的方式简短的写出来?

如果是个 Object, 可以用 Comparator.comparing(Person::getAge).thenComparing(Person::getScore)这种方式,换成是 Array 不知道该怎么办了。

谢谢
1947 次点击
所在节点    Java
6 条回复
sunjiayao
2021-07-27 23:04:01 +08:00
Arrays.stream().sorted()
6IbA2bj5ip3tK49j
2021-07-27 23:24:57 +08:00
Arrays.stream(x).sorted(Comparator.comparing(o -> ((int[]) o)[0]).thenComparing(o -> ((int[]) o)[1]))
aguesuka
2021-07-28 10:54:45 +08:00
Arrays.sort(array, Comparator.<int[]>comparingInt(arr -> arr[0])
.thenComparingInt(arr -> arr[1]));

3 个细节.
原地排序不需要使用 stream.
使用 comparingInt 而不是 comparing.
为 comparingInt 显示声明泛型参数<int[]> 而不是在 lambda 中 cast
aguesuka
2021-07-28 11:15:31 +08:00
如果子数组的长度非固定或者非常长, 可以用 Java9 的 Arrays#compare(int[], int[]) , 它是根据 ArraysSupport#mismatch 实现的, 底层是 Unsafe 方法. 比自己写的 compare 好一些.
shiji
2021-07-28 11:30:19 +08:00
@aguesuka 谢谢大佬
shiji
2021-07-29 08:22:49 +08:00
说来惭愧,虽然泛型经常用,这么用的却是第一次见到

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/792149

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX