В этот фрагмент кода подаются следующие входные данные:
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();
}
Кстати, «не читает первый символ в каждой второй строке» неверно, все числа читаются, чередуясь один раз на next("\\d+") и один раз на nextInt()




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