различие в вводе данных [дубликат]

260
02 апреля 2018, 23:58

На данный вопрос уже ответили:

  • Особенности использования scanner.nextLine() 1 ответ

Условие: стандартный ввод данных, первая строка - количество вводов (гарантированно что их не меньше двух), каждая следующая содержит две цифры: первая цифра - идентификатор задания; вторая - уровень загрузки, цифры разделены пробелом. Необходимо разделить и записать задания в два Queue массива согласно условию - задание добавляется в тот массив, загрузка которого меньше, если загрузка одинаковая, то задание добавляется в первый массив. Вывести получившиеся массивы. Мой код

import java.util.*;
class Test {
    public static void main(String[] args)   {
        Scanner in = new Scanner(System.in);
        Queue<Integer> first = new ArrayDeque<>();
        Queue<Integer> second = new ArrayDeque<>();
        int firstLoad = 0;
        int secondLoad = 0;
        int count = 0;
        int quantity = in.nextInt();
        while(true) {
            if(count==quantity) {
                break;
            }else {
                String temp = in.nextLine();   //start
                String[] tempArr = temp.split(" ");
                if (firstLoad<=secondLoad){
                    first.add(Integer.parseInt(tempArr[0]));
                    firstLoad = firstLoad + Integer.parseInt(tempArr[1]);
                    count++;
                } else {
                    second.add((Integer.parseInt(tempArr[0])));
                    secondLoad = secondLoad + Integer.parseInt(tempArr[1]);
                    count++;   //end
                }
//              int[] tempArr = new int[2];
//              tempArr[0] = in.nextInt();
//              tempArr[1] = in.nextInt();
//              if (firstLoad<=secondLoad){
//              first.add((tempArr[0]));
//              firstLoad = firstLoad + (tempArr[1]);
//              count++;
//              } else {
//              second.add(((tempArr[0])));
//              secondLoad = secondLoad + (tempArr[1]);
//              count++;
            }
        }
        for (Integer i : first){
            System.out.print(i + " ");
        }
        System.out.println();
        for (Integer i : second) {
            System.out.print(i + " ");
        }
    }
}

Вопрос - почему при запуске программы не спрашивает ввод строки в цикле (строка с коментом "//start"), а сразу кидает на добавление зачения в массив first и как следствие

Exception in thread "main" java.lang.NumberFormatException: For input string: ""

а если заменить код между //start и //end на закоментированный участок кода, то все норм...

Answer 1

Потому что в вашем коде вы используете Integer.parseInt() который кидает исключение если параметр не является числом. А оно так и есть если смотреть на сообщение исключения. Дело в том что после сплита появляется элемент массива с пустым значением. Вам нужно либо исключить этот элемент из цикла либо перехватывать исключение в отдельном блоке.

Answer 2

Вам не нужно разбивать строку по пробелам, так как Scanner делает это по умолчанию. Вот как следует поступить:

List<Integer> values = new ArrayList<>();
Scanner scanner = null;
try {
    scanner = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
    while(scanner.hasNext()) {
        values.add(Integer.valueOf(scanner.next()));
    }
} finally {
    if(scanner != null)
        scanner.close();
}

Здесь я не учел два момента:

  1. Пользователь может ввести не число;
  2. Нужно определить как закончить ввод (иначе программа будет постоянно ожидать ввода).

Update: Теперь программа учитывает, что пользователь может ввести не число. Сделал два списка (как у Вас), которые заполняются поочередно.

List<Integer> first = new ArrayList<>();
List<Integer> second = new ArrayList<>();
boolean flag = true;
try(Scanner scanner = new Scanner(new BufferedReader(new InputStreamReader(System.in)))) {
    while(scanner.hasNext()) {
        String s = scanner.next();
        if(!s.matches("-?\\d+(\\.\\d+)?"))
            continue;
        if(flag) {
            first.add(Integer.valueOf(s));
        }
        else {
            second.add(Integer.valueOf(s));
        }
        flag = !flag;
    }
}
READ ALSO
RSA разбиение текста на блоки

RSA разбиение текста на блоки

Здравствуйте, не подскажите, как в RSA идёт разбиение на блокиТ

263
Как сделать Hot Swap Java кода программно?

Как сделать Hot Swap Java кода программно?

Вообщем штука такаяМне нужно подключится к совершенно левому JVM процессу и заменить хотя бы тела ф-ий одного из его классов

260
Контравариантность stream в Java 8

Контравариантность stream в Java 8

Который раз спотыкаюсь на стримы и интерфейсы в JavaДопустим у меня есть интерфейс ToDeString и класс De, который его имплементит

258
Обработать Infinity при делении на ноль java

Обработать Infinity при делении на ноль java

Подскажите где ошибка? Не получается обработать деление на ноль

369