2012-11-01 68 views
0

我對前面提到的問題有一個補充。我有一個2D數組,我需要根據4個周圍元素來獲取每個元素的大小。周圍是上,下,左,右。如果一個或多個周圍元素超出數組邊界,即當前元素位於邊界上,則將超出邊界元素視爲當前元素。我的程序只在陣列是一個正方形,4×4,5×5等時才起作用。但是當它是一個rectagle,4 x 5,5 x 6,等我得到一個錯誤。我相信這是由於x和y的array.length不再相同。我不知道如何糾正這個錯誤,任何幫助將不勝感激!這是我當前的代碼:Java二維數組矩形錯誤

所有的
public class ArrayTest 
{ 


public static int[][] buildE(int[][] array) 
{ 

    int [][] arrayE = new int[array.length][array.length]; 

    int up; 
    int down; 
    int left; 
    int right; 

    for (int y = 0; y < array.length; y++) 
    { 
     for (int x = 0; x < array[y].length; x++) 
     { 

      //if element is on the top left 
      if (y == 0 && x == 0) 
      { 

       up = array[y][x]; 
       down = array[y + 1][x]; 
       left = array[y][x]; 
       right = array[y][x + 1]; 

      } 

      //if element is on bottom right 
      else if (y == array.length - 1 && x == array.length - 1) 
      { 

       up = array[y - 1][x]; 
       down = array[y][x]; 
       left = array[y][x - 1]; 
       right = array[y][x]; 

      } 

      //if element is on top right 
      else if(y == 0 && x == array.length - 1) 
      { 

       up = array[y][x]; 
       down = array[y + 1][x]; 
       left = array[y][x - 1]; 
       right = array[y][x]; 

      } 

      //if element is on bottom left 
      else if (y == array.length - 1 && x == 0) 
      { 

       up = array[y - 1][x]; 
       down = array[y][x]; 
       left = array[y][x]; 
       right = array[y][x + 1]; 

      } 

      //if element is on top 
      else if (y == 0) 
      { 

       up = array[y][x]; 
       down = array[y + 1][x]; 
       left = array[y][x - 1]; 
       right = array[y][x + 1]; 

      } 

      //if element is on left 
      else if (x == 0) 
      { 

       up = array[y - 1][x]; 
       down = array[y + 1][x]; 
       left = array[y][x]; 
       right = array[y][x + 1]; 

      } 

      //if element is on bottom 
      else if(y == array.length - 1) 
      { 

       up = array[y - 1][x]; 
       down = array[y][x]; 
       left = array[y][x - 1]; 
       right = array[y][x + 1]; 

      } 

      //if element is on right 
      else if (x == array.length - 1) 
      { 

       up = array[y - 1][x]; 
       down = array[y + 1][x]; 
       left = array[y][x - 1]; 
       right = array[y][x]; 

      } 

      //if element is not on an edge 
      else 
      { 

       up = array[y - 1][x]; 
       down = array[y + 1][x]; 
       left = array[y][x - 1]; 
       right = array[y][x + 1];  

      } 

      int element = array[y][x]; 
      int magnitude = Math.abs(element - up) + Math.abs(element - down) + Math.abs(element - left) + Math.abs(element - right); 

      System.out.println(); 
      System.out.print("#####################################"); 
      System.out.println(); 
      System.out.println("Array Element: " + array[y][x]); 
      System.out.println("Up: " + up); 
      System.out.println("Down: " + down); 
      System.out.println("Left: " + left); 
      System.out.println("Right: " + right); 
      System.out.println("Magnitude: " + magnitude); 
      System.out.println("X: " + x); 
      System.out.println("Y: " + y); 
      System.out.println("Array Length: " + array.length); 


      arrayE[y][x] = magnitude; 
     } 
    } 

    return arrayE; 

} 


public static void outputArray(int[][] array) 
{ 

    for(int row = 0; row < array.length; row ++) 
    { 

     for (int column = 0; column < array[row].length; column++) 
      System.out.printf("%d ", array[row][column]); 
     System.out.println(); 

    } 


} 

public static void main(String[] args) 
{ 

    int [][] myArray = {{1, 12, 13, 14, 15}, {2, 22, 23, 24, 25}, {3, 32, 33, 34, 35}, {4, 42, 43, 44, 45}, {5, 52, 53, 54, 55}, {6, 62, 63, 64, 65}}; 

    outputArray(myArray); 
    outputArray(buildE(myArray)); 

} 

} 
+1

和你得到的錯誤是...? – peroija

+2

你確定這段代碼是必需的嗎? – Vlad

+2

*「我對前面提到的問題有一個補充。」*由於沒有以'?'結尾的句子,提示我問..你現在***的問題是什麼? –

回答

2

首先,你的問題是,你正在使用array.length爲您的索引。您應該使用array[0].length作爲您的y座標。你在很多地方都這樣做,這就是爲什麼它不適用於矩形。

但是,如果對這種問題採取面向對象的方法,你會更好。試試這個:

public class ArrayTest { 
    public static enum Direction { 
     LEFT, RIGHT, UP, DOWN, SELF; 

     public int getValue(int[][] array, int yIndex, int xIndex) { 
      switch(this) { 
       case LEFT: 
        if (xIndex == 0) return array[yIndex][xIndex]; 
        return array[yIndex][xIndex - 1]; 
       case RIGHT: 
        if (xIndex == array[yIndex].length - 1) return array[yIndex][xIndex]; 
        return array[yIndex][xIndex + 1]; 
       case UP: 
        if (yIndex == 0) return array[yIndex][xIndex]; 
        return array[yIndex - 1][xIndex]; 
       case DOWN: 
        if (yIndex == array.length - 1) return array[yIndex][xIndex]; 
        return array[yIndex + 1][xIndex]; 
       default: 
        return array[yIndex][xIndex]; 
      } 
     } 
    } 

    public static int[][] buildE(int[][] array) { 
     int [][] arrayE = new int[array.length][array[0].length]; 

     for (int y = 0; y < array.length; y++) { 
      System.out.println("y = " + y); 
      for (int x = 0; x < array[y].length; x++) { 
       arrayE[y][x] = 0; 
       for (Direction d : Direction.values()) { 
        arrayE[y][x] += d.getValue(array, y, x); 
       } 
      } 
     } 

     return arrayE; 
    } 

    public static void outputArray(int[][] array) { 
     for(int row = 0; row < array.length; row ++) { 
      for (int column = 0; column < array[row].length; column++) 
       System.out.printf("%d ", array[row][column]); 
      System.out.println(); 
     } 
    } 

    public static void main(String[] args) { 
     int [][] myArray = {{1, 12, 13, 14, 15}, {2, 22, 23, 24, 25}, {3, 32, 33, 34, 35}, {4, 42, 43, 44, 45}, {5, 52, 53, 54, 55}, {6, 62, 63, 64, 65}}; 

     outputArray(myArray); 
     outputArray(buildE(myArray)); 
    } 
} 

你看如何讓爲你做的工作省去了大量的複製粘貼代碼,如果語句的對象?教一個對象如何做一份工作,然後說MyObject.doJob(),而不是讓你的主對象做這項工作。代表!