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。
无论如何,我可以让阵列接受扫描仪中的两种类型的数字,还是我必须采用另一种方式来运作?
答案 0 :(得分: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
和double
并且将执行而不会出现任何错误。
答案 1 :(得分:0)
我能想到解决这个问题的最简单方法是从Scanner
中获取String对象,然后将它们转换为它们的实际类型(如果String包含一个句点,你可以检测到它是双倍的当你需要将它们的值用于任何计算时。
答案 2 :(得分: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();
}