2017-02-22 401 views
1
import java.util.Scanner; 

public class PeopleWeights { 

    public static void main(String[] args) { 

    Scanner scnr = new Scanner(System.in); 

    final int NUM_VALS = 5; 

    int [] personsWeight = new int[NUM_VALS]; 

    int i = 0; 

    for (i = 0; i < NUM_VALS; ++i) { 
    System.out.print("Enter weight " + (i + 1) + ": "); 
    System.out.println(); 
    personsWeight[i] = scnr.nextInt(); 
    } 

    double sumVal = 0.0; 

    for (i = 0; i < NUM_VALS; ++i) { 
     sumVal = sumVal + personsWeight[i]; 
    } 

    double avgVal = 0.0; 

    for (i = 0; i < NUM_VALS; ++i) { 
     avgVal = sumVal/NUM_VALS; 
    } 

    double maxVal = 0.0; 

    for (i = 0; i < NUM_VALS; ++i) { 
     maxVal = personsWeight[0]; 
     if (maxVal < personsWeight[i]) { 
      maxVal = personsWeight[i]; 
     } 
    } 

    System.out.println(); 
    System.out.println(personsWeight[1] + " " + personsWeight[2] + " " 
    + personsWeight[3] + " " + personsWeight[4] + " " + personsWeight[5]); 
//I know that this can be cleaner but this is where the 
//problem occurs with a InputMismatchException. 
//I know it's caused by the double being introduced 
//but don't know how to fix it. 


    System.out.println("Total weight: " + sumVal); 

    System.out.println("Average weight: " + avgVal); 

    System.out.println("Max weight: " + maxVal); 

    return; 
    } 
} 

的輸入是如下: 236, 89.5, 142, 166.3, 93。如何在數組中接受並輸出雙精度和雙精度數?

我想處理輸入數字,就像輸入數字一樣。 Double或Int。

有無論如何,我可以讓陣列接受這兩種類型的數字在掃描儀或我不得不採取另一種方式,它的工作?

+2

正常情況下,將所有內容視爲「雙」。你可以在沒有問題的情況下將236存儲在「double」中。爲什麼重要的是你把它作爲一個整數?會有什麼不必要的後果將其保持爲雙重? – ajb

+0

另外,InputMismatchException發生在這一行:'personsWeight [i] = scnr.nextInt();'並且與數組類型無關。它與使用'nextInt()'的輸入有關,它有一個小數。 –

回答

1

您可以使用hasNextInt()hasNextDouble()方法Scanner類來初始確定輸入的數字是Double還是Integer。

if (scnr.hasNextInt()) { 
    int n = scnr.nextInt(); 
    //your code to handle `integer` case 
} 
else if(scnr.hasNextDouble()) { 
    double d = scnr.nextDouble(); 
    //your code to handle `double` case 
} 

僅供參考,您也可以保留所有內容爲double。它將處理int s和double s,並將執行時不會出現任何錯誤。

+0

謝謝。這爲我解決了它。簡單地看,如果它是一個int或雙是我需要的。 – AssassinsHonor

0

我認爲解決這個問題的最簡單方法是從Scanner中接收String對象,然後在需要使用時將它們轉換爲它們的實際類型(如果String包含句點,則可以檢測它是雙精度型)他們的價值爲任何計算。

1

陣列可以定義僅一種類型的,則可以定義double那裏,像double [] personsWeight = new double[NUM_VALS];當你輸入一個int類型,像236,它將被接受作爲double成陣列,輸出作爲double太。

+0

如果有一個很好的理由,你可以在數組中使用'Object []'(或者在這種情況下是'Number []')來創建多個類型,並且這些元素可以是'Double'或'Integer'(原始類型的_boxed_版本)。當然,這裏沒有理由。但是在一個數組中有多個類型的能力在其他情況下可能很有用。 – ajb

0

當你有一個數字列表,所有這些數字都代表相同類型的值(例如重量,金額,測試分數等)時,選擇一種適合所有你想處理的值的類型。對於重量,假設你想處理非整數,選擇一個浮點類型(即double)。爲了錢,你可以選擇BigDecimal;對於考試成績,除非你預計某人可能得到半分的成績,否則你可以選擇int,那麼你會選擇double。關鍵是,幾乎沒有從來沒有保持不同數值類型爲同一種價值的原因。

幾乎有從來沒有一個理由關心輸入是什麼格式 - 即,你真的關心輸入中的權重是否有小數點嗎?不,你只關心價值本身。這使一些較新的程序員感到困惑 - 他們將數字的值與其表示形式等同爲一個字符串。但幾乎總是,只有價值很重要。數字236,236.0,236.00000,2.36e2和0xec之間沒有區別 - 值是相同的,並且表示不重要。 [是的,我知道如果您在Java程序中使用這些不同的表單,有些將被視爲int,有些則被視爲double,這可能會有所作爲。但這裏的數字是在輸入文件中,而不是在代碼中。]

所以,只要讓重量爲double,不用擔心整數。

double[] personsWeight = new double[NUM_VALS]; 

int i = 0; 

for (i = 0; i < NUM_VALS; ++i) { 
    System.out.print("Enter weight " + (i + 1) + ": "); 
    System.out.println(); 
    personsWeight[i] = scnr.nextDouble(); 
}