具有最小/最大值的ArrayOutOfBounds

时间:2018-03-04 19:49:46

标签: java arrays

我正在尝试解决Project Euler问题18.我为每一行创建了一个数组(从底部开始),然后是这些数组的数组。我创建了一个从底行开始的递归方法,并向前看三行以找到最佳路径。

我创建了最小和最大方法,以确保我的数组的索引不能低于零,或高于长度减去1。

/**
 * A method that sets a minimum limit for an integer
 * @param a The number
 * @param b The lowest value it can go
 * @return a
 */
public static int min(int a, int b) {
    if (a<b) {
        a=b;
    }
    return a;
}
/**
 * Sets the maximum limit for an int
 * @param a the number
 * @param b The highest a number can go
 * @return a
 */
public static int max(int a, int b) {
    if(a>b) {
        a=b;
    }
    return a;
}

然后我在计算接下来三行中的所有可能路径时使用了这些方法。 我在这行代码中遇到Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11错误:

eighthPoss = array[x+2][max(i, array[x].length-1)] + array[x+1][max(i, array[x].length-1)] + array[x][max(i, array[x].length-1)];

其中x是当前行,i是行上的当前位置。 当ifx+2超过行数时(我们在倒数第二个或三角形的最后一行),我有x+1个语句。我真的很困惑这段代码中的任何内容是否超出界限,因为我在每个代码上都有最小值和最大值,以确保它们不会超出范围。我在错误x=1i=10之前运行了print语句和循环遍历的最后数字。 下面是我的阵列。 (我没有包括顶行,因为它只有一个数字。)

int[] row1 = {04, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 04, 23};
int[] row2 = {63, 66, 04, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31};
int[] row3 = {91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48};
int[] row4 = {70, 11, 33 ,28, 77, 73, 17, 78, 39, 68, 17, 57};
int[] row5 = {53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14};
int[] row6 = {41, 48, 72, 33, 47, 32, 37, 16, 94, 29};
int[] row7 = {41, 41, 26, 56, 83, 40, 80, 70, 33};
int[] row8 = {99, 65, 4, 28, 6, 16, 70, 92};
int[] row9 = {88, 2, 77, 73, 7, 63, 67};
int[] row10 = {19, 1, 23, 75, 3, 34};
int[] row11 = {20, 4, 82, 47, 65};
int[] row12 = {18, 35, 87, 10};
int[] row13 = {17, 47, 82};
int[] row14 = {95, 64};

int[][] rows = {row1, row2, row3, row4, row5, row6, row7, row8, row9, row10, row11, row12, 
                row13, row14};

非常感谢您给予我的任何帮助。

1 个答案:

答案 0 :(得分:2)

确保您的x+2不会越界,因为您似乎只是在查看i是否超出范围。 (您可能正在其他地方检查它,但您没有提供该代码)。

我亲自使用的奖励钳制方法,而不是单独的max和min方法(因为它们已经内置到Java中)。

public static int clamp(int a, int min, int max) {
    return Math.max(min, Math.min(max, a));
}