2012-10-09 51 views
0

我遇到了在Java中存儲多個輸入值的問題。首先,我使用ArrayList來存儲用戶輸入的輸入數量。然後我想在收集所有輸入之後進行計算。無法在Java中存儲多個輸入值

我的程序允許用戶輸入1之間5個不同的值,以5 1等於100, 2等於200, 3等於300, 4是等於400, 5是等於至500

我建立一個數組來存儲這些值

double numberArray[] = {100, 200, 300, 400, 500}; 

當用戶輸入1,該ArrayList將存儲所述第一輸入值。 當用戶輸入2時,ArrayList將存儲第二個輸入值,依此類推。 當用戶點擊「n」時,它將退出並添加。這意味着它將增加100和200一起,輸出將等於300

然而,問題是,當用戶保持輸入的數量,我的程序將僅在總的第一輸入的加在一起也就是100 + 100即使我輸入2作爲第二個輸入。

這裏是我的代碼:

import java.util.*; 

public class Total{ 

    static int total; 
    public static void main(String[] args) { 

    int numberArray[] = {100, 200, 300, 400, 500}; 

    List<String> list = new ArrayList<String>(); 
    Scanner input = new Scanner(System.in); 

    do{ 
     System.out.println("Add item? Please enter \"y\" or \"n\""); 
     if (input.next().startsWith("y")){ 
      System.out.println("Enter item number: "); 
      list.add(input.next()); 
      if (list.contains("1")){ 
       int item1 = numberArray[0]; 
       total = total + item1; 
      } else if(list.contains("2")){ 
       int item2 = numberArray[1]; 
       total = total + item2; 
      } else if(list.contains("3")){ 
       int item3 = numberArray[2]; 
        total = total + item3; 
      } else if(list.contains("4")){ 
        int item4 = numberArray[3]; 
       total = total + item4; 
      } else { 
      System.out.println("You have entered invalid item number!"); 
      break; 
      }    
     }else{ 
      System.out.println("You have entered all the item(s)."); 
      break; 
     }  
    } while(true); 
      System.out.println(The total is: " + total); 
    } 
} 
+2

類變量'total'應該是靜態的,否則你的代碼不會編譯 – Jayy

+1

你的代碼有多個問題,但最直接的是你正在從'input'中讀取兩次,就像MadProgrammer指出的那樣,您檢測輸入哪個選項的方式根本上是有缺陷的。看到你的錯誤在哪裏很簡單,只需在每一步中追蹤列表中的內容即可。在列表中放入'1'後,它將始終在列表中,即使是第二次。在這種情況下,後者如果被稱爲如何聲明呢? –

+0

您應該有錯誤,無法從靜態'main'方法引用非靜態變量'total'。 – Alex

回答

1

如有條件,應進行修改,以獲得預期的輸出如下面

if (list.get(list.size() -1).contains("1")) 

查看完整的代碼有固定的所有錯誤:

import java.util.*; 

public class Total{ 

    static int total; 
    public static void main(String[] args) { 

    int numberArray[] = {100, 200, 300, 400, 500}; 

    List<String> list = new ArrayList<String>(); 
    Scanner input = new Scanner(System.in); 

    do{ 
     System.out.println("Add item? Please enter \"y\" or \"n\""); 
     if (input.next().startsWith("y")){ 
      System.out.println("Enter item number: "); 
      String temp = input.next(); //store the user inputed element 
      list.add(temp); //add that element in list 
      //System.out.println(input.next()); 

      //Now use the temporary variable in if conditions 
      if (temp.contains("1")){ 
       int item1 = numberArray[0]; 
       total = total + item1; 
      } else if(temp.contains("2")){ 
       int item2 = numberArray[1]; 
       total = total + item2; 
      } else if(temp.contains("3")){ 
       int item3 = numberArray[2]; 
        total = total + item3; 
      } else if(temp.contains("4")){ 
        int item4 = numberArray[3]; 
       total = total + item4; 
      } else { 
      System.out.println("You have entered invalid item number!"); 
      break; 
      }     
     }else{ 
      System.out.println("You have entered all the item(s)."); 
      break; 
     }   
    } while(true); 

     System.out.println("Total is: " + total); 
    } 
} 
+0

這一個工程,你能解釋我爲什麼我必須使用「get()」和「size() - 1」? –

+0

爲什麼不把值存儲在局部變量中,將它添加到列表中並使用局部變量作爲'if'語句的條件? – MadProgrammer

+0

你正處於一個循環中,你正在做兩件事,i)將輸入的元素添加到arraylist中,並且還基於你想要總和的輸入元素。因此,爲了完成第二項任務,您需要輸入的元素,並已按照任務1保存。因此,我們正在讀取數組列表的最後一個元素,以便通過給list.get(list.size( )-1)。 – Jayy

1

你從掃描儀

list.add(input.next()); 
System.out.println(input.next()); 

讀兩次,但丟棄第二輸入...

UPDATE

好,所以這裏是我的看法

public class TestScanner03 { 

    private static int total; 

    public static void main(String[] args) { 

     int numberArray[] = {100, 200, 300, 400, 500}; 

     List<String> list = new ArrayList<String>(); 
     Scanner input = new Scanner(System.in); 

     // Better to use a stateful flag then simply "break" the loop 
     boolean stay = true; 
     do { 
      System.out.println("Add item? Please enter \"y\" or \"n\""); 
      String next = input.next(); 
      // Catch case issues 
      if (next.equalsIgnoreCase("y")) { 
       System.out.println("Enter item number: "); 
       next = input.next(); 
       try { 
        // Make sure that the user actually entered a numeric value 
        int value = Integer.parseInt(next); 
        switch (value) { 

         // Make sure the value is within range 
         case 1: 
         case 2: 
         case 3: 
         case 4: 
         case 5: 
          // Make sure we don't already have the value 
          if (!list.contains(next)) { 
           // Extract the "addition" from the number array... 
           total += numberArray[value - 1]; 
           list.add(next); 
           System.out.println("Your total is now " + total); 
          } else { 
           System.out.println(next + " is already used"); 
          } 
          break; 

         default: 
          break; 

        } 
       } catch (NumberFormatException numberFormatException) { 
        System.out.println(next + " is not a valid number"); 
       } 

      } else { 
       System.out.println("You have entered all the item(s)."); 
       stay = false; 
      } 
     } while (stay); 
     System.out.println("Your total is " + total); 
    } 

} 
+0

我刪除了該行,因爲它僅用於我的測試。 –

+0

您在更新中提到的行是用於查看用戶是否想要繼續。 –

+0

@o_o是的,我發現後,我發佈,更新與示例 – MadProgrammer

0

您的總數永遠不會增加,相反,它只是在第n個位置打印元素。

  if (list.contains("1")){ //You entered 2, this is false, total = 0 
       int item1 = numberArray[0]; 
       total = total + item1; // this doesn't get executed 
      } else if(list.contains("2")){ //true 
       int item2 = numberArray[1]; 
       total = total + item2; // total = 200 
      } else if(list.contains("3")){ //false 
       int item3 = numberArray[2]; 
        total = total + item3; // still total = 200, as this is not executed 
      } else if(list.contains("4")){ // false 
        int item4 = numberArray[3]; 
       total = total + item4; // not executed, still total = 200 
      } 

因此,更好的解決方案是使用switch語句或將輸入轉換爲int。

int input = Integer.parseInt(list.get(0)); 
if(input < 5) 
{ 
    for(int i = 0; i< input; i++) 
    total += numberArray[i]; 
} 
0

簡單地嘗試這種方式....

值分配給一個字符串變量,然後再次嘗試...

String getUserInput = new Scanner(System.in).next();

驗證碼:

do{ 
     System.out.println("Add item? Please enter \"y\" or \"n\""); 

     String getUserInput = new Scanner(System.in).next(); 

     if (getUserInput.startsWith("y")){ 
      System.out.println("Enter item number: "); 
      list.add(getUserInput); 
      System.out.println(getUserInput); 
      if (list.contains("1")){ 
       int item1 = numberArray[0]; 
       total = total + item1; 
      } else if(list.contains("2")){ 
       int item2 = numberArray[1]; 
       total = total + item2; 
      } else if(list.contains("3")){ 
       int item3 = numberArray[2]; 
        total = total + item3; 
      } else if(list.contains("4")){ 
        int item4 = numberArray[3]; 
       total = total + item4; 
      } else { 
      System.out.println("You have entered invalid item number!"); 
      break; 
      }    
     }else{ 
      System.out.println("You have entered all the item(s)."); 
      break; 
     }  
    } while(true); 
    } 
2

考慮一下,當我運行該程序會發生什麼。

首先運行:我回答'y';並輸入1list.contains("1")評估爲true。一切都很好,並且total=100
第二次運行:我回答'y';並輸入2。然而,list.contains("1")仍然評估爲true - 哎呀! 100應該再加上,當應該加上明確的200。實際上,每增加一個下一個運行就會增加100個,因爲list.contains("1")從現在開始一直是真實的。

而不是使用列表來存儲用戶輸入,而是使用String變量。更好的是,考慮使用input.nextInt(),並查找表中的值。

此外,您忘記了「5」的情況。

+0

+1;這是導致問題的原因。該列表將始終包含舊的選擇。 – maba

+0

這是對問題的非常好的解釋。 –