Java 以标记值作为数组输入

Java taking sentinel value as array input

我需要这个程序接受以下格式的用户输入:"team1 : team2 : score1 : score2" 然后将它分配给下面的数组变量,这工作正常但现在我需要在用户输入 'stop' 程序显示数组中数据的结果和统计信息。 问题是,当您输入停止时,它会尝试将其添加到数组中,但由于我已将输入分成 4 个部分,它只会给我一个错误(异常)

"java.lang.ArrayIndexOutOfBoundsException" error on the "awayteam = results[1];" line.

我的问题是:如果用户输入 'stop' 我该如何做到这一点,它不会尝试将其添加到数组中。

// 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

        }

    }
}

您只需要检查哨兵并在尝试解析它之前跳出 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

}

你只需要在添加数组之前测试它是否是 "stop" :

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

    // ...
}

在尝试解析之前,您需要检查 "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
    }

这将告诉您的程序,只有当下一行 包含 "stop" 时,它才应该尝试解析该行。 如果它包含停止那么它应该显示结果而不是

编辑: 注意到 ControlAltDel 的回答,他解释说不需要其中一个 for 循环,所以我从我的回答中删除了它

将 "Stopped" 部分移动到 break 以跳出循环。

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

之前 split(" : ")

而且您也不需要虚拟 for 循环。

您可以这样做:

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

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

    .....

}

sc.close();

另外记得关闭扫描仪 - sc.close();