2017-02-22 62 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.Как принимать и выводить как парные, так и интс в массиве?

Я хочу обрабатывать выходные номера так же, как они вводятся. Двойной или Int.

В любом случае я могу заставить массив принимать оба типа чисел в сканере или мне придется использовать другой способ, которым он работает?

+2

Нормальным было бы рассматривать все как «двойное». Вы можете хранить 236 в 'double' без проблем. Почему имеет значение, что вы храните его как целое? Какое нежелательное последствие было бы для того, чтобы сохранить его как двойное? – ajb

+0

Кроме того, 'InputMismatchException' происходит в этой строке:' personsWeight [i] = scnr.nextInt(); 'и не имеет ничего общего с типом массива. Это связано с использованием 'nextInt()' на входе, в котором есть десятичное число. –

ответ

1

Первоначально вы можете определить, если введенное число равно Double или Integer с использованием hasNextInt() или hasNextDouble() методов класса Scanner.

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 
} 

FYI, вы можете также сохранить все как double. Он будет обрабатывать как int s, так и double s и будет выполняться без каких-либо ошибок.

+0

Спасибо. Это решило это для меня. Просто смотреть, было ли это int или double, это все, что мне нужно. – AssassinsHonor

0

Самый простой способ, который я могу решить, это взять объекты String из Scanner, а затем преобразовать их в их фактический тип (вы можете обнаружить, что это двойник, если строка содержит период), когда вам нужно использовать их значение для любого расчета.

1

Массив может определить только один тип, вы можете определить double там, как double [] personsWeight = new double[NUM_VALS]; и когда вы вводите int типа, как 236, он будет принят в качестве double в массив, выход в double тоже.

+0

Если у вас есть веская причина, вы можете иметь несколько типов в массиве, создав его 'Object []' (или в этом случае 'Number []'), а элементы могут быть либо 'Double', либо' Integer' (_boxed_ версий примитивных типов). Здесь, конечно, нет причин. Но способность иметь несколько типов в массиве может быть полезна в других ситуациях. – ajb

0

Если у вас есть список чисел, которые представляют одинаковый вид (например, вес, сумма денег, оценка теста и т. Д.), Выберите один тип, который подходит для всех значений, которые вы хотите обработать , Для веса, предполагая, что вы хотите обрабатывать нецелые числа, выберите тип с плавающей точкой (т. Е. double). За деньги вы можете выбрать BigDecimal; для тестов, вы можете выбрать int, если вы не ожидаете, что кто-то может получить половину вычета за что-то, тогда вы бы выбрали double. Дело в том, что почти никогда не было причиной того, что разные числовые типы имеют одинаковый вид.

Существует почти никогда причина заботиться о том, в каком формате находится вход - i.e. вам действительно важно, имеет ли вес во вводе десятичная точка или нет? Нет, вы только заботитесь о самой ценности. Это смущает некоторых новых программистов - они приравнивают значение числа с его представлением в виде строки. Но почти всегда имеет значение только значение. Нет никакой разницы между номерами 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(); 
}