Анализ и сортировка окрестностей по диагонали массива

#java #bubble-sort #auto-populate #neighbours

#java #пузырьковая сортировка #автоматическое заполнение #соседи

Вопрос:

Я некоторое время боролся с этим и, похоже, ничего не добился. Настройка такая; У меня есть 2D-массив. Для этого массива мне нужно перебирать каждое значение и возвращать соседей по диагонали (5 значений). Эти соседи будут помещены в новый 1D [5] массив и отсортированы по пузырькам. Затем среднее значение (медиана) будет возвращено и помещено в новый массив медиан.

До сих пор у меня есть методы для извлечения диагональных соседей:

     //get diagonals from original DEM

    double [] getDiagonals(int i, int j) {

        double [] tempArray = new double [5];

        tempArray[0] = data[i -1][j  1];
        tempArray[1] = data[i -1][j -1];
        tempArray[2] = data[i][j];
        tempArray[3] = data[i  1][j -1];
        tempArray[4] = data[i  1][j  1];


        return tempArray;
    }
 

Затем я использовал этот метод на итерации, чтобы получить диагонали для каждого значения в исходном массиве:

         //get diagonals for each 

    double [] []   bubbles(){

        double [] [] datap = new double [298] [298];

        for (int i = 1; i < data.length; i  ){
            for (int j = 1; j < data[i].length; j  ) {
                if ((i > 0) amp;amp; (j > 0)) {
                    if ((i < data.length-1) amp;amp; (j  < data.length-1)){

                         double [] tempArray = getDiagonals(i, j);
//do something with the tempArray
 

Я думаю, что это то, где я отклеиваюсь. Благодаря тестированию метод getDiagonals работает нормально. Я изо всех сил пытаюсь извлечь tempArray из метода bubbles(). Если я установлю вывод как tempArray, он возвращает только 5 значений, вычисленных для нижнего правого угла исходного массива.

Я попытался вызвать другие методы в метод bubbles(), чтобы выполнить всю обработку там и вернуть новый массив:

     //get diagonals for each 

    double [] []   bubbles(){

        double [] [] datap = new double [298] [298];

        for (int i = 1; i < data.length; i  ){
            for (int j = 1; j < data[i].length; j  ) {
                if ((i > 0) amp;amp; (j > 0)) {
                    if ((i < data.length-1) amp;amp; (j  < data.length-1)){

                         double [] tempArray = getDiagonals(i, j);
                         double sorted [] = sort(tempArray);
                         double median = sorted[2];


                            for (int z = 0; z < datap.length; z  ){
                                for (int y = 0; y < datap[z].length; y  ){
                                datap[z][y] = median;
                                }
                            }   



                    }
                }   
            }
        }
        return datap;
    }
 

Снова это не удается, и выходной datap — это просто нули. Метод sort (), приведенный выше, передал диагонали в метод пузырьковой сортировки (который, как я знаю, работает на его

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

Я надеюсь, что это имеет смысл, но если вам нужна более подробная информация, пожалуйста, дайте мне знать. И да, сортировка, которую я использую, — это пузырьковая сортировка. Я знаю, что это мусор, но это для курса, который я делаю, поэтому его нужно использовать. И да, я довольно новичок в Java.

Любая помощь будет с благодарностью принята (и я даже буду ссылаться на вас, если мне нужно будет использовать какой-то код, который вы предоставляете;)

Ответ №1:

Основная проблема, которую я вижу, заключается в том, что при каждом обходе вашего внутреннего цикла:

 for (int i = 1; i < data.length; i  ){             
   for (int j = 1; j < data[i].length; j  ) {
 

Где вы вызываете:

 double [] tempArray = getDiagonals(i, j);
 

Вы сбрасываете все значения datap , которые будут вычисляться текущими median . Чтобы исправить, вам понадобится какой-то способ указать только индексы определенного datap значения, которое вы хотите заполнить.

Вам необходимо заменить этот раздел вашего кода:

 for (int z = 0; z < datap.length; z  ){
    for (int y = 0; y < datap[z].length; y  ){
    datap[z][y] = median;
    }
}   
 

Вы могли бы объявить int y, z в верхней части метода и сделать что-то вроде этого:

 if (y < datap.length){
    if (z == datap.length[y] - 1){
        y  ;
        z = 0;
    }

    datap[y][z] = median;
    z  ;
}
 

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

Комментарии:

1. Спасибо за быстрый ответ. Я пробовал это и теперь создаю исключение ArrayIndexOutOfBoundsException 298. В моем методе я определил, что массив равен [298] [298], поэтому я не уверен, почему он должен быть за пределами.

Ответ №2:

Наконец-то взломал его. Для заполнения всего массива следующий код работает отлично.

 //Diagonal to 1dArray and sorting

double [] [] bubbles()
{
    double [][] tempArray = new double [300][300];

    int y = 0;
    int z = 0;
    double median = 0;

    for (int i = 0; i < data.length; i  )
    {
        for (int j = 0; j < data[i].length; j  )
        {
            if ((i > 0) amp;amp; (j > 0))
            {
                if ((i  1 < data[i].length) amp;amp; (j  1 < data[j].length))
                {
                    double [] diagonals = getDiagonals(i, j);

                    //Need to sort here
                    median = diagonals[2];
                    tempArray[i][j] = median;
                }
            }
        }
    }
    return tempArray;
}
 

Сортировка была удалена, и я еще не тестировал ее снова; но пока это предоставляет новые значения для всех ячеек во временном массиве.