Как отсортировать двумерный массив лексикографически? - PullRequest
0 голосов
/ 23 декабря 2018

Предполагая, что у нас есть двумерный массив следующим образом:

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] ]

многие вопросы на этом сайте, кажется, предлагают сортировку только по первому элементу каждого массива или второйи т.д., но не принимая во внимание весь массив.

1 Ответ

0 голосов
/ 23 декабря 2018

Начиная с JDK9, появился новый метод под названием Arrays.compare, который позволяет сравнивать два заданных массива лексикографически .

Краткое описание Arrays.compare из документации:

Если два массива имеют общий префикс, то лексикографическое сравнение является результатом сравнения двух элементов, как если бы это было с помощью Integer.compare (int, int),по индексу в соответствующих массивах, который является длиной префикса.В противном случае один массив является правильным префиксом другого, и лексикографическое сравнение является результатом сравнения двух длин массива.

Если вы хотите изменить массив sourceтогда использования Arrays.sort должно быть достаточно:

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

Если вы хотите получить новый массив в результате, тогда я бы пошел потоком:

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