2

我有一个数组 [300][300],我需要去掉边缘并用剩余的值填充一个新数组 [298][298]。到目前为止,我已经做到了:

double[][] edging() {
   double [][] array = new double [data.length] [data[0].length];
   array = bubbles();   
   double [] [] newArray = new double[array.length-2][array[0].length-2]; 

   System.arraycopy(array,1,newArray, 0, newArray.length);

   array = newArray;
   System.out.println( + newArray.length);  
   System.out.println( + newArray[0].length);   

   return newArray;
}

这可以去除顶部和底部边缘。但是,左右手都还在。那里的检查显示新数组是[298] [300]。

我考虑过编写一个循环来依次删除每一行,在每一行上使用 arraycopy 并返回新行。不确定这是否会非常有效。

试过这个但无济于事。下一个测试是旋转它并再次使用上面的代码。

4

1 回答 1

2

干得好。您不一定要使用 System.arraycopy() 因为它仍然在 O(n^2) 运行时间内执行。在下面的程序中,我没有处理边缘情况,但这应该为你做。

class MyClass {
    public static void main(String[] args) {
        MyClass myClass = new MyClass();

        int[][] sampleArray = {{11, 12, 13, 14, 15, 16},
                {17, 18, 19, 20, 21, 22},
                {23, 24, 25, 26, 27, 28},
                {29, 30, 31, 32, 33, 34},
        };

        myClass.removeEdges(sampleArray);
    }


    public int[][] removeEdges(int[][] arrayToTrim){
        int[][] newArray = new int[arrayToTrim.length-2][arrayToTrim[0].length-2];
        print2DArray(arrayToTrim);
        for(int i=1;i<arrayToTrim.length-1;i++){
            for(int j=1;j<arrayToTrim[0].length-1;j++){
                newArray[i-1][j-1] = arrayToTrim[i][j];
            }
        }
        System.out.println();
        print2DArray(newArray);
        return newArray;
    }

    private void print2DArray(int[][] anArray){
        for(int i=0;i<anArray.length;i++){
            System.out.println();
            for(int j=0;j<anArray[0].length;j++){
                System.out.print(anArray[i][j]+" ");
            }
        }
    }
}

上述程序的输出是

11 12 13 14 15 16 
17 18 19 20 21 22 
23 24 25 26 27 28 
29 30 31 32 33 34 

18 19 20 21 
24 25 26 27 
于 2011-11-02T07:18:04.660 回答