【问题标题】:Java taking sentinel value as array inputJava将标记值作为数组输入
【发布时间】:2017-06-26 15:40:32
【问题描述】:

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

“awayteam =”上的“java.lang.ArrayIndexOutOfBoundsException”错误 结果[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

        }

    }
}

【问题讨论】:

  • 在您尝试分配变量之前检查 SENTINEL,就在您阅读下一行之后。您可以在 if 语句中包围分配,或者您可以简单地中断。

标签: java arrays loops sentinel


【解决方案1】:

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

}

【讨论】:

    【解决方案2】:

    使用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();

    【讨论】:

    • 感谢所有回答的人,非常有帮助!但我只能勾选一个最佳答案。
    【解决方案3】:

    您只需要在添加数组之前测试它是否“停止”:

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

    【讨论】:

      【解决方案4】:

      在尝试解析之前,您需要检查“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”时,它才会尝试解析该行。 如果它包含 stop 那么它应该显示结果

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-11
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 2018-02-01
        • 1970-01-01
        • 2018-05-29
        • 2019-11-28
        相关资源
        最近更新 更多