我正在尝试编写一个使用sentinal contolled do-while循环的程序,它反复询问用户正整数。
当用户输入负值时,循环应该结束。循环完成后,程序应打印出正数的最小值,最大值,平均值和计数 由用户输入。
然而,当我运行程序时,我收到错误:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at posNeg.main(posNeg.java:31)
我已经搜索了答案,但似乎没有一个工作。大多数建议您从=
删除for (int i = 0; i <= (count); i++) {
。
无论如何,这是完整的代码:
import java.util.*;
import java.lang.Math;
public class posNeg {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList list = new ArrayList();
int num;
int count = 0;
do{
System.out.println("enter pos nums (or a neg num to quit): ");
num = sc.nextInt();
list.add(num);
count++;
} while (num >= 0);
Iterator it = list.iterator();
list.remove(list.get(count-1));
Object max = Collections.max(list);
Object min = Collections.min(list);
System.out.print(list);
int tot = 0;
for (int i = 0; i <= (count); i++) {
Object piece = list.get(i);
int piecenum = ((Number) piece).intValue();
tot = tot + piecenum;
}
double avg;
avg = tot/count;
System.out.println("the max is "+max+". the min is "+min+". the avg is "+avg);
}
}
答案 0 :(得分:1)
构建列表时,会增加计数。
在构建count==list.size()
之后。
之后,您从列表中删除一项,但不要更改count
。
所以count==list.size()-1
。
所以你的循环应该是
for (int i = 0; i <= count-2; i++) {
因为您有从索引0
到count-2
的商品。
但不是保持计数,你可以简单地做
for (int i = 0; i<list.size(); i++) {
答案 1 :(得分:0)
看看这个循环:
for (int i = 0; i <= (count); i++) {
此时列表中只有count - 1
项,但您循环count + 1
次。为了理智,你应该在调用count
之后递减remove
,然后也将循环更改为更惯用的:
for (int i = 0; i < count; i++) {
或者更简单:
for (Number number : list) {
...
}
只有在list
通用后才能使用此功能:
List<Number> list = new ArrayList<Number>();
你应该真的使用泛型来收藏。
答案 2 :(得分:0)
最好这样做......
for (int i = 0; i < (count); i++) {
}
或强>
使用For-Each
循环
for(Number n : list){
}
答案 3 :(得分:0)
正如其他人所指出的那样,这个错误是有罪的。我建议在输入循环中使用条件break;
以避免将负值添加到列表中,并递增计数。首先。每当使用基于零索引的语言时,您仍需要将<=
替换为<
。
答案 4 :(得分:0)
尝试此list.size
而非计数
for (int i = 0; i < list.size(); i++) {
Object piece = list.get(i);
int piecenum = ((Number) piece).intValue();
tot = tot + piecenum;
}
答案 5 :(得分:0)
一些建议,,,
do{
System.out.println("enter pos nums (or a neg num to quit): ");
num = sc.nextInt();
if (num >= 0)
break;
list.add(num);
}while (true);
..并为下一个循环
int tot = 0;
for (int i : list ) {
//do your stuff
}
..但你应该使用打字列表
List<int> list = new ArrayList<int>()
......或类似的东西