2012-10-01 91 views
1

我正在嘗試編寫一個程序,該程序使用了一個sentine控制的do-while循環,該循環反覆詢問用戶正整數。處理用戶輸入時ArrayList IndexOutOfBoundsException

當用戶輸入負值時,循環應該結束。循環結束後,程序應打印出用戶輸入的正數的最小值,最大值,平均值和計數值。

然而,當我運行程序時,我得到的錯誤:

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); 
    } 
} 
+1

「大多數人只是建議刪除'='」...試試吧。 – Vulcan

+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++) { 
0

看這個循環:

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

此時列表中只有count - 1項目,但你循環count + 1倍。對於理智的緣故,你應該調用remove後遞減count,然後改變循環到更地道:

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

或者說更簡單:

for (Number number : list) { 
    ... 
} 

這將只有在製作list後纔有效:

List<Number> list = new ArrayList<Number>(); 

您應該確實正在使用泛型進行收藏。

0

更好地這樣做....

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


} 

或者

使用For-Each

for(Number n : list){ 


} 
0

的錯誤是在數,正如其他人指出。我建議在輸入循環中使用條件break;以避免將負值添加到列表中,並增加計數。首先。無論何時使用基於零的索引的語言,您仍需要將<=替換爲<

0

試試這個list.size而不是數

for (int i = 0; i < list.size(); i++) { 
      Object piece = list.get(i); 
      int piecenum = ((Number) piece).intValue(); 
      tot = tot + piecenum; 
     } 
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>() 

...或類似的東西