Ожидать в цикле ввод с консоли

Всем привет!

Пытаюсь считать с консоли команду и выполнить действия в зависимости от неё. Но, при выполнении String query = sc.nextLine(); внутри цикла ввод с клавиатуры не ожидается и цикл переходит сразу на следующую итерацию i = 1. Как заставить подождать ввод с клавиатуры?

Scanner sc = new Scanner(System.in);
int q = sc.nextInt();
        for (int i = 0; i < q; i++) {
            String query = sc.nextLine();
            if (query.equalsIgnoreCase("Insert")) {
                int x = sc.nextInt();
                int y = sc.nextInt();
                myList.add(x, y);
            } else if (query.equalsIgnoreCase("Delete")) {
                int x = sc.nextInt();
                myList.remove(x);
            }
        }


Ответы (1 шт):

Автор решения: Alex Krass

Scanner работает так, что когда вы считываете sc.nextInt() и нажимаете Enter в вашей консоли, он оставляет перевод строки не считанным и запоминает его. Как только он наткнулся на sc.nextLine(), он это перевод видит и берет его в виде пустой строки.

Чтобы такого не происходило, при работает со Scanner надо предварительно очищать его от таких переводов строки, которые в нем остались if (sc.hasNextLine()) sc.nextLine();.

Scanner sc = new Scanner(System.in);
int q = sc.nextInt();
if (sc.hasNextLine()) sc.nextLine();

for (int i = 0; i < q; i++) {
    System.out.println("q");
    String query = sc.nextLine();
    if (query.equalsIgnoreCase("Insert")) {
        int x = sc.nextInt();
        int y = sc.nextInt();
        if (sc.hasNextLine()) sc.nextLine();
    } else if (query.equalsIgnoreCase("Delete")) {
        int x = sc.nextInt();
        if (sc.hasNextLine()) sc.nextLine();
    }
}
→ Ссылка