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()

その後、リストから1つのアイテムを削除しますが、変更しないでくださいcount

だからcount==list.size()-1

だからあなたのループは

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

0インデックスから。までのアイテムがあるからcount-2です。

しかし、カウントを維持する代わりに、あなたは単にすることができます

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

いくつかの提案、、、

    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

他の人が指摘しているように、バグはカウントにあります。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 に答える
0

こうすればいいのに……。

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


 }

または

For-Eachループを使う

for(Number n : list){


}
于 2012-10-01T17:58:22.513 に答える