Java 求和谜题,遇到我找不到的越界错误
Java sum puzzle, stuck with out of bounds error that I can't find
在尝试解决 java 中的编程难题时,我遇到了一些我不理解的错误,尽管我已经尝试编辑代码/缩小代码范围以尝试想办法。
我的整个程序在下面,你一贴就可以运行(主要方法是用我已经制作的方法中我想要的当前测试参数编写的)。拼图的描述写在class开始后的右边,但简而言之拼图就是做一个方法,有3个参数a,b,c,方法return s 这些 3 的总和,除非它们中的任何一个是整数 13 - 在这种情况下,这个 13 和右边的参数从总和中省略。
当我尝试 运行 我当前的测试时,它说在 if(x == 0 && x == 13)
行下有一个 ArrayIndexOutOfBoundsException: 3
错误,它是在 for 循环 for(int x=0; x<params.length; x++)
.[= 下找到的16=]
我不明白这个错误是怎么来的 - 我添加了使 x
成为数组内参数的计数器,并向其添加 1 和 2 以使元素位于右侧0. 我理解它 可能 在这里越界,但它在 if 语句下检查 x 是否为 13 和 0,这意味着它有仅在我检查第一个参数(在索引 0 处)时执行此操作。但由于某种原因,它仍然是越界的,就好像它正在 x>=1 处进行检查,其中 +1 和 +2 之后会将它发送到界外。
任何人都可以看到导致错误的原因吗?
注意:我解决这个问题的想法是将参数存储在数组中,检查它们是否为 13,如果是使该数字为 0 并将其右侧存储的为 0,则 return 的总和之后的数组。
public class Logic2Q3 {
/*
* Given 3 int values, a b c, return their sum. However, if one of the values is 13
* then it does not count towards the sum and values to its right do not count.
* So for example, if b is 13, then both b and c do not count.
*
* e.g.:
* luckySum(1, 2, 3) -> 6
* luckySum(1, 2, 13) -> 3
* luckySum(1, 13, 3) -> 1
*
*/
public int luckySum(int a, int b, int c) {
int[] params = new int[3]; // array to store params
int sum = 0; // for storing the final sum
// store params for checking here
params[0] = a;
params[1] = b;
params[2] = c;
// check the array of parameters and alter them according to specs
for(int x=0; x<params.length; x++) {
// in the case 13 is found
if(params[x] == 13) {
// case that it's the first element (a) and is also the 13
if(x == 0 && x == 13)
// make both elements on the right 0 to not add to the sum
params[x] = 0;
params[x+1] = 0;
params[x+2] = 0;
// case that it's the second element (b)
if(x == 1 && x == 13)
// make only the element on the right 0
params[x] = 0;
params[x+1] = 0;
}
}
// after the array is altered to omit a, b, and c being 13 or to the right of 13, sum everything
for(int x=0; x<params.length; x++) {
// += must be used on initialised instance variable only
sum += params[x];
}
return sum;
}
public static void main(String[] args) {
Logic2Q3 test = new Logic2Q3();
System.out.println(test.luckySum(3,13,7));
}
}
for 循环第二次运行时,如果 param[x] 等于 13 或任何晚于 0 的时间,总是执行行 params[x+2] = 0
!请阅读 a coding guideline for java 并且永远不要在没有使用 {//if statement stuff}
设置正确范围的情况下使用 if 语句 !!!
阅读指南后,您应该能够解决您的问题!
编辑:此外,那些 if 语句永远不可能为真! x 不能同时等于 0 和 13
虽然您的代码可能会创建一个 IndexOutOfBoundExeption
,因为您确实访问了 x+1
或 x+2
处的值,但还有其他错误。缺少括号并且 if 条件永远不会为真,因为您检查一个值是否等于两个值(不合逻辑吗?)。
总而言之,我最好的猜测是,您正在使这个完整的 luckySum "puzzle" 变得有点复杂,因为您真正需要的只是一个循环和一个变量总和。找到一个值后,您可以简单地 break
退出循环并 return 总和。这是您所做操作的更简化版本。
public static void main(String[] args) {
System.out.println(luckySum(1, 2, 3));
System.out.println(luckySum(1, 2, 13));
System.out.println(luckySum(1, 13, 3));
}
/**
* Given 3 int values, a b c, return their sum. However, if one of the values is 13
* then it does not count towards the sum and values to its right do not count.
* So for example, if b is 13, then both b and c do not count.
*
* e.g.:
* luckySum(1, 2, 3) -> 6
* luckySum(1, 2, 13) -> 3
* luckySum(1, 13, 3) -> 1
*
*/
public static int luckySum(int... values) {
// Using varargs for dynamic amound of values
// Sum variable
int sum = 0;
// loop over all values
for(int x=0; x<values.length; x++) {
// in the case 13 is found break out of the loop
if(values[x] == 13) {
break;
// As a second option you could just return sum here
// return sum;
}
// add value to the sum
sum += values[x];
}
return sum;
}
O/P
6
3
1
在尝试解决 java 中的编程难题时,我遇到了一些我不理解的错误,尽管我已经尝试编辑代码/缩小代码范围以尝试想办法。
我的整个程序在下面,你一贴就可以运行(主要方法是用我已经制作的方法中我想要的当前测试参数编写的)。拼图的描述写在class开始后的右边,但简而言之拼图就是做一个方法,有3个参数a,b,c,方法return s 这些 3 的总和,除非它们中的任何一个是整数 13 - 在这种情况下,这个 13 和右边的参数从总和中省略。
当我尝试 运行 我当前的测试时,它说在 if(x == 0 && x == 13)
行下有一个 ArrayIndexOutOfBoundsException: 3
错误,它是在 for 循环 for(int x=0; x<params.length; x++)
.[= 下找到的16=]
我不明白这个错误是怎么来的 - 我添加了使 x
成为数组内参数的计数器,并向其添加 1 和 2 以使元素位于右侧0. 我理解它 可能 在这里越界,但它在 if 语句下检查 x 是否为 13 和 0,这意味着它有仅在我检查第一个参数(在索引 0 处)时执行此操作。但由于某种原因,它仍然是越界的,就好像它正在 x>=1 处进行检查,其中 +1 和 +2 之后会将它发送到界外。
任何人都可以看到导致错误的原因吗?
注意:我解决这个问题的想法是将参数存储在数组中,检查它们是否为 13,如果是使该数字为 0 并将其右侧存储的为 0,则 return 的总和之后的数组。
public class Logic2Q3 {
/*
* Given 3 int values, a b c, return their sum. However, if one of the values is 13
* then it does not count towards the sum and values to its right do not count.
* So for example, if b is 13, then both b and c do not count.
*
* e.g.:
* luckySum(1, 2, 3) -> 6
* luckySum(1, 2, 13) -> 3
* luckySum(1, 13, 3) -> 1
*
*/
public int luckySum(int a, int b, int c) {
int[] params = new int[3]; // array to store params
int sum = 0; // for storing the final sum
// store params for checking here
params[0] = a;
params[1] = b;
params[2] = c;
// check the array of parameters and alter them according to specs
for(int x=0; x<params.length; x++) {
// in the case 13 is found
if(params[x] == 13) {
// case that it's the first element (a) and is also the 13
if(x == 0 && x == 13)
// make both elements on the right 0 to not add to the sum
params[x] = 0;
params[x+1] = 0;
params[x+2] = 0;
// case that it's the second element (b)
if(x == 1 && x == 13)
// make only the element on the right 0
params[x] = 0;
params[x+1] = 0;
}
}
// after the array is altered to omit a, b, and c being 13 or to the right of 13, sum everything
for(int x=0; x<params.length; x++) {
// += must be used on initialised instance variable only
sum += params[x];
}
return sum;
}
public static void main(String[] args) {
Logic2Q3 test = new Logic2Q3();
System.out.println(test.luckySum(3,13,7));
}
}
for 循环第二次运行时,如果 param[x] 等于 13 或任何晚于 0 的时间,总是执行行 params[x+2] = 0
!请阅读 a coding guideline for java 并且永远不要在没有使用 {//if statement stuff}
设置正确范围的情况下使用 if 语句 !!!
阅读指南后,您应该能够解决您的问题!
编辑:此外,那些 if 语句永远不可能为真! x 不能同时等于 0 和 13
虽然您的代码可能会创建一个 IndexOutOfBoundExeption
,因为您确实访问了 x+1
或 x+2
处的值,但还有其他错误。缺少括号并且 if 条件永远不会为真,因为您检查一个值是否等于两个值(不合逻辑吗?)。
总而言之,我最好的猜测是,您正在使这个完整的 luckySum "puzzle" 变得有点复杂,因为您真正需要的只是一个循环和一个变量总和。找到一个值后,您可以简单地 break
退出循环并 return 总和。这是您所做操作的更简化版本。
public static void main(String[] args) {
System.out.println(luckySum(1, 2, 3));
System.out.println(luckySum(1, 2, 13));
System.out.println(luckySum(1, 13, 3));
}
/**
* Given 3 int values, a b c, return their sum. However, if one of the values is 13
* then it does not count towards the sum and values to its right do not count.
* So for example, if b is 13, then both b and c do not count.
*
* e.g.:
* luckySum(1, 2, 3) -> 6
* luckySum(1, 2, 13) -> 3
* luckySum(1, 13, 3) -> 1
*
*/
public static int luckySum(int... values) {
// Using varargs for dynamic amound of values
// Sum variable
int sum = 0;
// loop over all values
for(int x=0; x<values.length; x++) {
// in the case 13 is found break out of the loop
if(values[x] == 13) {
break;
// As a second option you could just return sum here
// return sum;
}
// add value to the sum
sum += values[x];
}
return sum;
}
O/P
6
3
1