1

我正在尝试编写一个使用哨兵控制的 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);
    }
}
4

6 回答 6

1

当你建立你的列表时,你会增加计数。

所以建好之后count==list.size()

之后,您从列表中删除一项但不要更改count

所以count==list.size()-1

所以你的循环应该是

for (int i = 0; i <= count-2; i++) {

因为你有从 index0count-2.

但是,您可以简单地做,而不是保持计数

for (int i = 0; i<list.size(); i++) {
于 2012-10-01T17:53:11.427 回答
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>()

... 或类似的东西

于 2012-10-01T18:28:36.210 回答
0

最好这样做……

for (int i = 0; i < (count); i++) {


 }

或者

使用For-Each循环

for(Number n : list){


}
于 2012-10-01T17:58:22.513 回答
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>();

真的应该为集合使用泛型。

于 2012-10-01T17:53:25.513 回答
0

正如其他人所指出的那样,该错误与计数有关。我建议在输入循环中使用条件break;来避免将负值添加到列表中并增加计数。首先。每当使用基于零索引的语言时,您仍然需要替换<=为。<

于 2012-10-01T18:09:09.783 回答
0

试试这个list.size而不是计数

for (int i = 0; i < list.size(); i++) {
            Object piece = list.get(i);
            int piecenum = ((Number) piece).intValue();
            tot = tot + piecenum;
        }
于 2012-10-01T18:10:40.307 回答