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

Я боролся с этим в течение некоторого времени и, кажется, ничего не получаю. Настройка такова; У меня есть двумерный массив. Для этого массива мне нужно перебрать каждое значение и вернуть диагональных соседей (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) && (j > 0)) {
                    if ((i < data.length-1) && (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) && (j > 0)) {
                    if ((i < data.length-1) && (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;
    }

Опять же, это не удается, и выходные данные просто нули. Приведенный выше метод sort() передал диагонали методу пузырьковой сортировки (который, как я знаю,

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

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

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


person Oliver Burdekin    schedule 29.10.2011    source источник


Ответы (2)


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

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, который вы пытаетесь достичь, вместо того, чтобы сбрасывать каждое из его значений.

person Hari Seldon    schedule 29.10.2011
comment
Спасибо за быстрый ответ. Я пробовал это и теперь выбрасываю исключение ArrayIndexOutOfBoundsException 298. В моем методе я объявил массив равным [298][298], поэтому я не уверен, почему он должен быть за пределами границ. - person Oliver Burdekin; 01.11.2011

Наконец взломал. Чтобы заполнить весь массив, следующий код отлично работает.

//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) && (j > 0))
            {
                if ((i +1 < data[i].length) && (j +1 < data[j].length))
                {
                    double [] diagonals = getDiagonals(i, j);

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

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

person Oliver Burdekin    schedule 01.11.2011