【问题标题】:How to sort two dimensional array lexicographically?如何按字典顺序对二维数组进行排序?
【发布时间】:2018-12-22 21:06:52
【问题描述】:

假设我们有一个二维数组如下:

int[][] source = {
  {   3,  5,  6,  1},
  {   3,  3,  5, -6},
  {  -1, -3, -5, -6},
  { 124, 43, 55, -66}
};

我们如何对多维数组source按字典顺序进行排序?

因此,我希望它是:

[ [ -1, -3, -5,  -6], 
  [  3,  3,  5,  -6], 
  [  3,  5,  6,   1], 
  [124, 43, 55, -66] ]

这个网站上的很多问题似乎只建议按每个数组的第一个元素或第二个、第三个等进行排序,而不是考虑整个数组。

【问题讨论】:

  • 非常好的问题。我试图通过交换以 3 开头的行来以一种让“按字典顺序”更容易理解的方式格式化示例数组,因此在这种情况下,应该在比较时使用下一列的值形式会更加明显。希望你不要介意。

标签: java arrays sorting java-9


【解决方案1】:

从 JDK9 开始,有一个名为 Arrays.compare 的新方法允许您比较两个给定的数组按字典顺序。

文档中对Arrays.compare 的简短描述:

如果两个数组共享一个共同的前缀,那么字典序 比较是比较两个元素的结果,好像通过 Integer.compare(int, int),在各自数组中的索引处 那是前缀长度。否则,一个数组是正确的前缀 另一个,词典比较是比较的结果 两个数组长度。

如果您想修改 source 数组,那么使用 Arrays.sort 就足够了:

Arrays.sort(source, Arrays::compare); 

如果你想要一个 new 数组作为结果,那么我会采用流方式:

int[][] sorted = Arrays.stream(source)
                       .sorted(Arrays::compare)
                       .toArray(int[][]::new);

【讨论】:

  • 在 Java 8 中,您可以使用 Comparator.comparing(IntBuffer::wrap) 代替 Arrays::compare。顺便说一句,对于数组初始化器,您不需要new int[][] 或new int[]。
猜你喜欢
  • 2020-09-26
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
相关资源
最近更新 更多