#java #arrays
#java #массивы
Вопрос:
Итак, у меня есть 2D-матрица, и я пытаюсь распечатать значения от наибольшего к наименьшему. Я в основном делаю это, всегда ища max, и когда я нахожу его, я устанавливаю эту позицию равной 1
in adjacencyMatrix
, чтобы мы не считали ее снова. Проблема в том, что когда я тестировал код, он начинался правильно, распечатывая самый большой, а затем пропускал второй по величине. Затем найдены 3-й и 4-й по величине. Пропустил еще немного, а затем, наконец, просто начал печатать 0s.
Вот мой код:
public static void findLongestPath(int rows, int columns, int[][] elevationMatrix, int[][] adjacencyMatrix)
{
int max = 0;
for (int x = 0; x < rows * columns; x )
{
for (int i = 0; i < rows; i )
{
for (int j = 0; j < columns; j )
{
if (elevationMatrix[i][j] > max amp;amp; adjacencyMatrix[i][j] == 0)
{
max = elevationMatrix[i][j];
adjacencyMatrix[i][j] = 1;
}
}
}
System.out.println(max);
max = 0;
}
}
Я некоторое время смотрел на это и не могу найти ошибку, поэтому я подумал, что другая пара глаз может помочь.
PS Пожалуйста, пожалуйста, пожалуйста, не говорите мне сортировать массив, потому что я могу это сделать. Мне нужно поддерживать порядок исходного массива.
Комментарии:
1. Создайте одномерную
rows * columns
копию исходного массива и отсортируйте ее.2. @LouisWasserman Тогда я потеряю позиции. Это часть большой программы, и мне нужно знать местоположение каждого значения.
3. Затем вы собираетесь написать класс, реализующий
Comparable
сохранение позиции и значения, а затем отсортировать их.4. Не уверен, что вы имеете в виду под этим. Кроме того, что не так с тем, как я это делаю?
5. Для начала потребуется выполнить
rows * columns * rows * columns
шаги, которые будут длиться вечно.
Ответ №1:
public static void findLongestPath(int rows, int columns, int[][] elevationMatrix, int[][] adjacencyMatrix)
{
int max = 0;
int cX, cY;
for (int x = 0; x < rows * columns; x )
{
for (int i = 0; i < rows; i )
{
for (int j = 0; j < columns; j )
{
if (elevationMatrix[i][j] > max amp;amp; adjacencyMatrix[i][j] == 0)
{
max = elevationMatrix[i][j]; // possible max, xth iteration
cX = i; // store i
cY = j; // store j
}
}
}
System.out.println(max); // global max, xth iteration
max = 0;
// cX and cJ now point to coordinates of global max
// all the possible max value coordinates are ignored.
adjacencyMatrix[cX][cJ] = 1;
}
}
Я думаю, вам нужно установить adjacencyMatrix[][] = 1
, после того, как вы найдете наибольшее число по всей матрице (global max), вместо того, чтобы находить max (возможный max).
Могут быть более эффективные способы сделать это, я указываю, что нужно сделать в этом методе, чтобы он работал.
Комментарии:
1. Я добавил комментарии. Обратитесь к ним. Если это все еще неясно, оставьте комментарий. Буду рад помочь 🙂
Ответ №2:
public static void findLongestPath(int rows, int columns, int[][] elevationMatrix)
{
class PosAndValue implements Comparable<PosAndValue> {
final int x;
final int y;
final int value;
PosAndValue(int x, int y, int value) {
this.x = x;
this.y = y;
this.value = value;
}
public int compareTo(PosAndValue other) {
return Integer.compare(value, other.value);
}
}
PosAndValue[] array = new PosAndValue[rows * columns];
for (int i = 0; i < rows; i ) {
for (int j = 0; j < columns; j ) {
array[i * columns j] = new PosAndValue(i, j, elevationMatrix[i][j]);
}
}
Arrays.sort(array);
for (int i = array.length - 1; i >= 0; i--) {
System.out.println(array[i].value);
}
}
Ответ №3:
Проблема в том, что вы пытаетесь псевдосортировать его.
Просто создайте список или одномерный массив всех значений и отсортируйте его. Если вы объявите временный массив в методе, то поток сборки мусора в конечном итоге подберет его.
Ваш метод может состоять из ~ 10 строк: добавьте все значения во временный массив, отсортируйте его, распечатайте все значения.
int[] tempArr = new int[rows * columns];
for(int i = 0; i < rows; i ){
for(int j = 0; j < columns; j ){
tempArr[(i * col) j] = elevationMatrix[i][j];
}
}
Arrays.sort(tempArr);
for(int x = (rows * columns) - 1; x >= 0; x--){
System.out.println(tempArr[x]);
}
Комментарии:
1. OP сказал, что им нужно отслеживать исходные позиции.
2. Он сказал, что ему нужно сохранить порядок исходного массива. Это делает это.
3. Но при просмотре он не сообщает вам
tempArr[x]
, какая позиция вelevationMatrix
этом значении изначально была получена, и OP сказал в комментариях, что им это нужно.4. ОК. Я этого не видел. Было бы не слишком сложно добавить это к этому, но я вижу, что OP уже нашел свой ответ.