2011-11-01 87 views
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并返回新行。不知道这是否会非常有效。 试过这个,但无济于事。下一个测试就是旋转它并再次使用上面的代码。

在此先感谢您的任何建议。

回答

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 
+1

由于Bragboy。我一定会试试这个。比我刚刚想到的更优雅。我使用arraycopy去除顶部和底部边缘,旋转90度,重复arraycopy然后旋转它。笨拙而可怕的,我很惊讶,甚至工作。 –

+0

@Oliver Burdekin:虽然它运作良好,但Arraycopy在运行时间方面是一种代价高昂的方法。请尽量避免它。 – bragboy

+1

只是测试和确认。你是一个天才。再次感谢Bragboy! –