Scanner.next() не читает первый символ в каждой второй строке

В этот фрагмент кода подаются следующие входные данные:

5
0 4 15
1 0 14 2 7 3 23
2 0 7
3 1 23 4 16
4 2 15 3 9

Проблема в том, что всякий раз, когда номер строки нечетный, первое целое число будет читаться не как «String newVertexID = inputs.next("\\d+");», как предполагалось, а как «System.out.println("next: " + inputs.next("\\d+"))», т. е. newVertexID присваиваются 0, 2, 4, как предполагалось, а 1, 3 передаются второму оператору печати, а это не то, чего я хочу.

Сначала я думал, что проблема возникает из-за символа новой строки в конце каждой строки, но я пробовал так много вещей (все, что я закомментировал, это то, что я пробовал), что теперь я начал сомневаюсь. Как мне понять, почему?

 Graph graph = new Graph();  
        Scanner inputs = new Scanner(System.in);
        int vertexCounts = inputs.nextInt();
        // inputs.nextLine();
        for (int i = 0; i < vertexCounts; i++){
            // inputs.nextLine();
            inputs.skip("\n");
            String newVertexID = inputs.next("\\d+");
            System.out.println(newVertexID);
            Vertex newVertex = new Vertex(newVertexID);
            graph.addVertex(newVertex);
            while(inputs.hasNextInt()){
                System.out.println("Why are you running");
                System.out.println("next: " + inputs.next("\\d+"));
                System.out.println(inputs.nextInt());
                // graph.addEdge(newVertexID, inputs.next(), inputs.nextInt());
            }
            // inputs.nextLine();

        }

разделителем по умолчанию Scanner является любой пробел, включая перевод строки и возврат каретки, то есть токены будут разделены любым пробелом; поэтому hasNextInt() ищет целое число даже в следующей строке, и все числа будут прочитаны в первой итерации for

user85421 08.04.2024 20:55

Кстати, «не читает первый символ в каждой второй строке» неверно, все числа читаются, чередуясь один раз на next("\\d+") и один раз на nextInt()

user85421 08.04.2024 21:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте вот так. Это один из немногих случаев, когда может быть полезно использовать два сканера: один для чтения строки, другой для ее анализа. Я добавил несколько улучшений вывода.

Scanner inputs = new Scanner(System.in);
int vertexCounts = inputs.nextInt();
inputs.nextLine();  // remove extra nl in input buffer.
System.out.println(vertexCounts);
for (int i = 0; i < vertexCounts; i++){
    String line = inputs.nextLine();
    System.out.println(line);
    Scanner parseLine = new Scanner(line);
    int vertexID = parseLine.nextInt();
    System.out.println("vertexID = " + vertexID);
 
    while(parseLine.hasNextInt()){
        System.out.println("Why are you running");
        System.out.println("next: " + parseLine.nextInt());
        // graph.addEdge(newVertexID, inputs.next(), inputs.nextInt());
    }

}     

Большое спасибо! Он работает отлично. Я застрял в этой проблеме последние 3 дня, и слов недостаточно, чтобы выразить мою благодарность, ха-ха

Goamhobala 08.04.2024 22:26

Другие вопросы по теме