#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;
}
Сортировка была удалена, и я еще не тестировал ее снова; но пока это предоставляет новые значения для всех ячеек во временном массиве.