从2d数组中删除边

问题描述 投票:2回答:1

我有一个数组[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并返回新行。不确定这是否会非常有效。

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

java arrays copy 2d edge-detection
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 
© www.soinside.com 2019 - 2024. All rights reserved.