Java принимает значение часового в качестве ввода массива

Мне нужно, чтобы эта программа принимала пользовательский ввод в следующем формате: "team1: team2: Score1: Score2", а затем присваивала его переменным массива ниже, что работает нормально, но теперь мне нужно сделать так, чтобы пользователь вводил "stop" Программа отображает результаты и статистику данных в массиве. Проблема в том, что когда вы вводите stop, он пытается добавить его в массив, но, поскольку я разделил ввод на 4 части, он просто выдает ошибку (исключение)

Ошибка "java.lang.ArrayIndexOutOfBoundsException" для "awayteam = results[1];" линия.

Мой вопрос: как я могу сделать так, чтобы, если пользователь вводит "стоп", он не пытается добавить его в массив.

// Sample input: Chelsea : Arsenal : 2 : 1

public static final String SENTINEL = "stop";

public static void main(String args[]) {

        Scanner sc = new Scanner(System.in);

        String hometeam = new String();
        String awayteam = new String();
        String homescore = new String();
        String awayscore = new String();

        int result0;
        int result1;

        int sum = 0;

        System.out.println("please enter match results:");

        for (int b = 0; b < 100; b++) {

            String s = sc.nextLine();

            String results[] = s.split(" : "); // parse strings in between the
                                                // dash
                                                // character

            for (String temp : results) {
                hometeam = results[0];
                awayteam = results[1];
                homescore = results[2];
                awayscore = results[3];
            }
            //convert 'score' strings to int value.
            result0 = Integer.valueOf(results[2]);
            result1 = Integer.valueOf(results[3]);

            //stop command 
            if (s.equals(SENTINEL)) {
                System.out.println("stopped");
            }


            // print results

        }

    }
}

4 ответа

Решение

Переместить деталь "Остановлено" с помощью break вырваться из петли.

if (s.equals(SENTINAL)) {
      System.out.println("Stopped");
      break;
    }

до split(" : ")

А также вам не нужен манекен для петли.

Вы можете сделать это вместо этого:

while ( sc.hasNextLine() )
{
    String s = sc.nextLine();

    if (s.equals(SENTINAL)) {
          break;
        }

    .....

}

sc.close();

Также не забудьте закрыть сканер - sc.close();

Вам просто нужно проверить дозорный и выйти из цикла for, прежде чем пытаться разобрать его.

Кроме того, ваш другой цикл for неверен. Вы помещаете одни и те же значения в свои переменные N раз. (Я добавил комментарий, помечая его как неверный)

System.out.println("please enter match results:");

for (int b = 0; b < 100; b++) {

    String s = sc.nextLine();

    //CHECK FOR SENTINAL MATCH RIGHT AFTER READING THE NEXT LINE
    if (s.equals(SENTINAL)) {
      break;
    }

    String results[] = s.split(" : "); // parse strings in between the
                                        // dash
                                        // character



    for (String temp : results) { // You don't need this for loop
        hometeam = results[0]; 
        awayteam = results[1];
        homescore = results[2];
        awayscore = results[3];
    }
    //convert 'score' strings to int value.
    result0 = Integer.valueOf(results[2]);
    result1 = Integer.valueOf(results[3]);

    //stop command 
    if (s.equals(SENTINEL)) {
        System.out.println("stopped");
    }


    // print results

}

Вы должны проверить, равно ли "s" или содержит "стоп", прежде чем пытаться разобрать его. Причина, по которой вы получаете массив вне границ, заключается в том, что ваша программа пытается выполнить синтаксический анализ перед проверкой, введен ли пользователь stop.

Попробуйте изменить свой код, чтобы он был чем-то вроде

    String s = sc.nextLine();
    if(!s.contains("stop")){
                String results[] = s.split(" : "); // parse strings in between the
                                        // dash
                                        // character
        for (String temp : results) {
            hometeam = results[0];
            awayteam = results[1];
            homescore = results[2];
            awayscore = results[3];
        }
        //convert 'score' strings to int value.
        result0 = Integer.valueOf(results[2]);
        result1 = Integer.valueOf(results[3]);

        //stop command 
        if (s.equals(SENTINEL)) {
            System.out.println("stopped");
        }
    } else {
        //display results
    }

Это сообщит вашей программе, что только если следующая строка не содержит "стоп", она должна попытаться проанализировать строку. Если он содержит стоп, он должен отображать результаты вместо

Изменить: Заметив ответ ControlAltDel, он объяснил, что один из циклов for не нужен, поэтому я удалил его из своего ответа

Вам просто нужно проверить, остановился ли он перед добавлением в массив:

while (sc.hasNextLine()){ // better than the for loop

    String line = sc.nextLine();

    if ("stop".equals(line)){
        System.out.println("stopped");
        return; // exit
    }

    String[] results = line.split(" : ");

    // ...
}
Другие вопросы по тегам