我正在编写一个程序来读取包含匹配结果的文本文件,然后将它们输出到表中。我在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循环,但对我来说,似乎是最合乎逻辑的。这里没有声明一些对象 - 这只是代码片段,因为我知道它们有效,所以声明了这些声明,并且声明了很多。
答案 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循环的每次迭代结束时递增。