0

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

2 Answers2

0

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

Roman C
  • 9,043
  • 4
  • 20
  • 28
  • прочтите еще раз вопрос, после сплита появляется пустой массив потому что не вызывается стандартный ввод строки (если бы он вызвался, то Integer.parseInt() конвертировало бы элемент масива tempArr в число) – Maksim Dzianisik Mar 31 '18 at 22:44
  • @RomanC, а вот и не правда. Никакого пустого элемента не появляется, специально проверил. Следующий код - String s = "5 6"; System.out.print(s.split(" ").length); вернет 2. – not a Programmer Apr 01 '18 at 09:34
  • @Maksim Не правильно, стандартный ввод как раз таки вызывается но чтение блокируется. – Roman C Apr 01 '18 at 09:58
  • @not Приведенный вами код не имеет никакого отношения к проблеме указанной в вопросе, атак же к моему ответу. – Roman C Apr 01 '18 at 10:02
  • @RomanC, как это не имеет? Я говорю, что Ваше утверждение: Дело в том что после сплита появляется элемент массива с пустым значением - является неверным и привожу пример, который это подтверждает. – not a Programmer Apr 01 '18 at 10:19
  • @ not Ваш пример не является частью кода из вопроса. Поэтому он не имеет отношение к моему ответу. – Roman C Apr 01 '18 at 14:03
0

Вам не нужно разбивать строку по пробелам, так как 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;
    }
}