我一直在与这个斗争一段时间,似乎无处可去。设置是这样的;我有一个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) && (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很新。
非常感谢任何帮助(如果我需要使用您提供的代码,我甚至会引用您的信息;)
答案 0 :(得分:0)
我看到的主要问题是每次遍历内部循环:
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++;
}
这样您只需要分配到{I} {}}中的特定索引,而不是重置其每个值。
答案 1 :(得分:0)
最后破解了它。要填充整个数组,以下代码将起作用。
//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;
}
分类被取出,我还没有用它进行测试;但到目前为止,这是为临时数组中的所有单元格提供新值。