2015-09-25 40 views
-2

我有一个数组,其中包含一些数字,它们通过代码以程序方式生成,我想删除不必要的数组部分。将一个二维数组向下划分为需要的部分

因此,直到现在我尽我所能创建我自己的代码,但它不工作得很好(这就是为什么我在这里)。

这是我尝试:

private void cutPlacementMap() { 
    int firstNeededX = Integer.MAX_VALUE; 
    int firstNeededZ = Integer.MAX_VALUE; 
    int lastNeededX = -1; 
    int lastNeededZ = -1; 

    for (int x = 0; x < placementMap.length; x++) { 
     for (int z = 0; z < placementMap[0].length; z++) { 
      if (placementMap[x][z] != 0) { 
       if (x < firstNeededX) 
        firstNeededX = x; 

       if (z < firstNeededZ) 
        firstNeededZ = z; 

       if (x > lastNeededX) 
        lastNeededX = x; 

       if (z > lastNeededZ) 
        lastNeededZ = z; 
      } 
     } 
    } 

    int lengthX = lastNeededX - firstNeededX; 
    int lengthZ = lastNeededZ - firstNeededZ; 
    int[][] newPlacementMap = new int[lengthX + 1][lengthZ + 1]; 

    System.out.println("lengthX: " + lengthX); 
    System.out.println("lengthZ: " + lengthZ); 
    int conX = 0; 
    int conZ = 0; 

    for (int x = firstNeededX; x <= lastNeededX; x++) { 
     for (int z = firstNeededZ; x <= lastNeededZ; z++) { 
      newPlacementMap[conX][conZ] = placementMap[x][z]; 
      conZ++; 
     } 
     conZ = 0; 
     conX++; 
    } 

    placementMap = newPlacementMap; 

} 

此代码引发ArrayIndexOutOfBoundException。这是指出newPlacementMap[conX][conZ] = placementMap[x][z];作为例外的原因。

每一个帮助表示赞赏。谢谢。

回答

1

自己调试应该很容易。

看看你的循环:

for (int z = firstNeededZ; x <= lastNeededZ; z++) 

这将永远循环下去(或者直到你得到ArrayIndexOutOfBoundsException),因为你的停止条件包含一个错字。

x <= lastNeededZ当然必须是z <= lastNeededZ

+0

好抓!他的'newPlacementMap'变量是否应该改变它们的边界,还是它们是原样的? –

+0

@ShotgunNinja我认为他们确实是不正确的。 +1不是必需的。但是让它们过大不会导致异常。此外,检查这些东西的最简单方法是启动调试器;-) – Robin

+0

实际上,回顾一下,我认为它们是故意制作的,因为(例如)如果只需要X方向上的一个元素,然后'firstNeededX == lastNeededX',所以'lengthX == 0',否则在需要1xZ容器时会导致0xZ容器。问题的症结在于,声明时应该添加+1,否则打印的值与容器的真实大小不匹配。 –