Как я могу распечатать значения 2D-массива в порядке убывания?

#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 уже нашел свой ответ.