While循环条件的问题

时间:2015-01-12 20:55:07

标签: java loops while-loop nested-loops

我正在编写一个程序来读取包含匹配结果的文本文件,然后将它们输出到表中。我在While循环中有一个While循环:

Scanner fileread1 = new Scanner(new File("demo.txt"));
int x = 0;
int y = 22;
int i = 0;
while (x <= y) {

    while (fileread1.hasNext()) {
    fileinput = fileread1.nextLine(); // this reads the next line of

    // from the file
    String line = fileinput;
    String[] split = line.split(":");
    boolean result = false;
    int homescore1 = 0;
    int awayscore1 = 0;
    int goalsscored = 0;
    boolean att = false;
    boolean htt = false;
    int atscore = 0;
    int htscore = 0;

    // When the text line is read, it is then split into four sections.

    if (split.length == 4) {

        // String text = line.trim();
        String userteam = userteaminput;
        String hometeam = split[0].trim();
        String awayteam = split[1].trim();
        String home_score = split[2].trim();
        String away_score = split[3].trim();

        // this is a test to try convert the goals string into a
        // integer. If this fails, the result is not
        // not valid and does not get outputted to the console.
        try {
            homescore1 = Integer.parseInt(home_score);
            awayscore1 = Integer.parseInt(away_score);
            result = true;
        }

        catch (NumberFormatException exception) {
            // if the try is not able to convert, this will run
            errors++;
        }


        if (userteam.equals(Teams.get(i))) {

            if (awayteam.equalsIgnoreCase(userteam)) {
                att = true;
                games++;
                goalsfor = goalsfor + awayscore1;
                goalsagainst = goalsagainst + homescore1;
            }

            if (att == true && awayscore1 > homescore1) {                                                                   
                atwc++;
                gameswon++;
            }

            else if (att == true && awayscore1 < homescore1) {
                htwc++;
                gameslost++;
            }

            else if (att == true && awayscore1 == homescore1) {
                gamesdrawn++;
            }

            if (hometeam.equalsIgnoreCase(userteam)) {
                htt = true;
                totaluser++;
                games++;
                goalsfor = goalsfor + homescore1;
                goalsagainst = goalsagainst + awayscore1;

            }

            if (htt == true && homescore1 > awayscore1) {                                   
                atwc++;
                gameswon++;

            }

            else if (htt == true && homescore1 < awayscore1) {
                htwc++;
                gameslost++;
            }

            else if (htt == true && awayscore1 == homescore1) {
                gamesdrawn++;
            }
        } 
    }
        else {
            errors++;

        }
    }

        // ********************************************************************
        // Leeds IF Statement
        // ********************************************************************
        if (Rhinos.equals(Teams.get(i)) {
            Rhinos.goalsfor = Rhinos.goalsfor + goalsfor;
            Rhinos.gameswon = Rhinos.gameswon + gameswon;
            Rhinos.gameslost = Rhinos.gameslost + gameslost;
            Rhinos.goalsagainst = Rhinos.goalsagainst; 
            Rhinos.gamesplayed = Rhinos.gamesplayed + games; 
        }
          else if (Bulls.equals(Teams.get(i)) {
            Bulls.goalsfor = Bulls.goalsfor + goalsfor;
            Bulls.gameswon = Bulls.gameswon + gameswon;
            Bulls.gameslost = Bulls.gameslost + gameslost;
            Bulls.goalsagainst = Bulls.goalsagainst; 
            Bulls.gamesplayed = Bulls.gamesplayed + games;
        } 
        x++;
        i++;
        goalsfor = 0;
        gameswon = 0;
        gameslost = 0;
        gamesagainst = 0;
        }

我知道只有22个团队在提供的文本文件中有结果,所以第一个循环应该运行22次。

内部循环将继续,而提供的文件有下一行。文本文件有时可能比其他文件有更多行结果。在这个循环中,我有一个Array项的引用:

if (userteam.equals(Teams.get(i)))

在第一次运行中,这将在我的数组中引用0,记录为Leeds Rhinos。一旦内循环完成,它就会移动到外循环 - 这将处理刚刚记录的结果。如果当前团队是Leeds Rhinos,那么它应该添加值。然后我应该添加1,所以对于下一个循环,它引用数组的1的索引,而不是0.(我这里有更多的IF语句,所有相同但引用其他团队)变量设置回0 ,准备下一次运行。

我遇到的问题是, i 每次运行时似乎都没有添加1,所以我只是为一个团队获得了结果。如果我手动指定要查看的数组索引(例如3),它将会运行,并且团队将成功记录其结果。

有没有办法可以在每次循环时将<1>添加到 i ?我不确定这是否是正确使用的java循环,但对我来说,似乎是最合乎逻辑的。这里没有声明一些对象 - 这只是代码片段,因为我知道它们有效,所以声明了这些声明,并且声明了很多。

3 个答案:

答案 0 :(得分:1)

如果您担心增量失败,最好使用For循环。

而不是在代码中某处(x&lt; y)并在某处添加增量语句,

for (i = 0; i < y; i++) { // do tests here }

循环将保证您始终为下一个团队增加并运行测试。

为了将来参考,当使用while循环和递增时,增量几乎总是在while循环的END处完成,而不是介于两者之间。增量语句也应该几乎不会出现在条件语句中(这可能会导致无限循环)。

答案 1 :(得分:0)

你的问题不明确。但是,让我们在您提供的代码中指出一些内容

1)你的if和else if语句有什么区别?他们正在检查完全相同的事情

if (userteam.equals(Teams.get(i)) {
     Rhinos.goalsfor = Rhinos.goalsfor + goalsfor;
     Rhinos.gameswon = Rhinos.gameswon + gameswon;
     Rhinos.gameslost = Rhinos.gameslost + gameslost;
     Rhinos.goalsagainst = Rhinos.goalsagainst; 
     Rhinos.gamesplayed = Rhinos.gamesplayed + games; 
}
else if (userteam.equals(Teams.get(i)) {
     Bulls.goalsfor = Bulls.goalsfor + goalsfor;
     Bulls.gameswon = Bulls.gameswon + gameswon;
     Bulls.gameslost = Bulls.gameslost + gameslost;
     Bulls.goalsagainst = Bulls.goalsagainst; 
     Bulls.gamesplayed = Bulls.gamesplayed + games;
} 

2)你用变量x做什么,我没有看到你在增加它的任何地方。

3)在第一次运行时,当x <= y时,内部循环将完成所有行的读取,因此即使你将X增加一些点,从第二次运行开始,内部循环也不会执行。因为它已经读完了所有的线条。所以没有必要这样做

如果你在想要完成的内容中提供更多内容,可能会使用示例文本文件数据,这可能有助于回答你的问题。

谢谢。

答案 2 :(得分:0)

你的格式在这里对你不利;正确缩进,你的代码结构是这样的(注意,我必须在你提供的代码的末尾添加缺少的结束括号},因为我假设你在复制代码时错过了它们) :

Scanner fileread1 = new Scanner(new File("demo.txt"));
int x = 0;
int y = 22;
int i = 0;
while (x <= y) {
    while (fileread1.hasNext()) {
        fileinput = fileread1.nextLine(); // this reads the next line of

        /* stuff */

        if (split.length == 4) {

            /* stuff */

            x++;
            i++;
        }
    }
}

x和i的增量嵌套在if (split.length == 4) {中,这意味着x和i只会在特定情况下递增,而不会在内部while循环的每次迭代结束时递增。