Как написать компаратор для сортировки 2D-массива на основе второго столбца с использованием лямбда-выражения - PullRequest
3 голосов
/ 05 июля 2019

Я работаю над проблемой сортировки 2D-массивов в Java. Я хочу отсортировать массив на основе второго столбца в каждой строке, например [i] [1]. Я пытаюсь написать лямбда-выражение, чтобы поместить его в Arrays.sort (a, компаратор), чтобы избежать написания целого класса.

Вот что я попробовал:

Arrays.sort(contests, (int[] num1, int[] num2) -> Integer number1 = num1[1];
   Integer number2 = num2[1];
    return number2.compareTo(number1);
);

Я не уверен, что не так, потому что Java не выдаст мне точное сообщение об ошибке при запуске. Я знаю, что первая часть лямбда-выражения является входной, а вторая часть сравнивается. Так как .compareTo () работает только для объектов, поэтому я создаю два целых числа. Затмение продолжает говорить мне, чтобы вставить; после целого числа. Кто-нибудь может мне помочь? Спасибо

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Определения типов внутри лямбда-выражения возникают из контекста, дальнейшие определения типов не требуются.
Ваш пример работает только со значениями из массива contests[1].
Arrays.sort() ожидает одномерный массив.
Если contests определено как Integer[][] array, то это выражение должно работать для Вас:

Arrays.sort( contests[1], (num1, num2) -> ( num2.compareTo( num1 ) ) );


Сортировать оба соответствующих массива - Arrays.sort() не будет работать:

index1 = 0;  // defined as class variable
index2 = 0;  // defined as class variable
Arrays.stream( contests[1] ).map( (n) -> new Integer[] {
    contests[0][index1], contests[1][index1++]
} ).sorted( (arr1,arr2) -> Integer.compare( arr2[1], arr1[1] ) )
.forEach( (arr) -> {
  contests[0][index2] = arr[0];
  contests[1][index2++] = arr[1];
} );

Один из способов - связать соответствующие значения (тот же индекс) contests[0] с contests[1] и отобразить эти массивы в значения contest[1].
После сортировки запишите значения обратно в цикл forEach.

1 голос
/ 05 июля 2019

Глядя на документы для Arrays.sort(array, comparator), можно обнаружить, что входной массив должен иметь класс в качестве типа, поскольку компаратор сравнивает объекты типа T.

public static <T> void sort(T[] a, Comparator<? super T> c)

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

В качестве альтернативы, вы можете использовать потоки, чтобы позволить вам достичь своей цели из-за автобокса, который произойдет по пути. Вот решение, использующее потоки и лямбду, как вы просили:

int[][] contests = { { 1, 7 }, { 2, 5 }, { 3, 2 }, { 4, 3 } };
Arrays
  .stream(contests)
  .sorted((a1, a2) -> a1[1] - a2[1])
  .forEach(a -> System.out.println(Arrays.toString(a)));

Рабочий образец можно найти здесь: https://repl.it/@randycasburn/2D-array-sort

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...