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(" : ");
// ...
}