Java将sentinel值作为数组输入

时间:2017-06-26 15:40:33

标签: java arrays loops sentinel

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

  

" java.lang.ArrayIndexOutOfBoundsException" " awayteam =上的错误   结果[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 个答案:

答案 0 :(得分:2)

在尝试解析之前,您只需检查哨兵并突破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

}

答案 1 :(得分:1)

移动部件&#34;停止&#34;用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();

答案 2 :(得分:0)

你只需要测试它是否&#34;停止&#34;在添加数组之前:

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

    // ...
}

答案 3 :(得分:0)

在尝试解析之前,您需要检查“s”是否等于或包含“stop”。你得到一个数组越界的原因是因为你的程序在检查用户是否进入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循环不需要,所以我从答案中删除了