我正在使用while和for循环遍历文本文件。
我的代码的目标是迭代我的CSV逗号分隔的文本文件,其中包含2列,只能通过字符串解析到地图。我不想要整数,这就是我的程序要做的事情。
问题是,每次重新启动while循环以转到下一行时,它都会重新启动我的变量,并假设它始终位于第一行。
这是我的代码:
CSVReader reader = new CSVReader(new FileReader("sortMark12.txt"), ',');
List<String[]> myEntries = reader.readAll();
reader.close();
//mark12Line is a string of the file name, and mark12Br is a buffered reader
//While the text file's line is not empty
whileloop: while ((mark12Line = mark12Br.readLine()) != null)
{
//Declaring row, this keeps getting reset
for (int row = 0; row < myEntries.size(); row++)
{
//Declaring column, this also keeps getting reset
for (int column = 0; row < myEntries.get(row).length; column++)
{
//While the row and column is not an integer
while (!isInteger(myEntries.get(row)[column]))
{
//Put the value in position row and column into the map.
mark12Map.put(mark12Line.split(",")[0], myEntries.get(row)[column]);
continue whileloop;
}
}
}
}
我的代码中发生的事情是,在第一行和第一列,它将其检测为整数,因此它不会将该整数放入映射中。第一行和第二列是一个字符串,因此放在地图中。
问题是,一旦完成,它会继续我的while循环,并且row
和column
都已重置为0.所以它就好像它仍然在同一条线上,甚至虽然我已经在row++
和column++
处增加了它。
为什么我的整数变量会一直重置为0?我需要它们每次增加一个不同的行。
我是在宣称它们是错的,还是其他东西破坏了我的代码。
如果您需要更多代码,请告知我们。
感谢您的帮助。
答案 0 :(得分:2)
根据我对您的问题描述和您对Paul Guiheen的回答的理解,我认为以下代码可能更接近您的应用程序的预期逻辑:
/* EDITED ...see below */
每次外部row
循环执行时,column
和while
变量都会被重置,因为它们正在内部 while
循环中初始化。换句话说,每次外部while
循环执行时,它们将被重新初始化为零。
您可以将其初始化移到外部while
循环以避免这种情况,如下所示:
int row = 0;
int column = 0;
whileloop: while (/* test something */)
{
for ( ; row < myEntries.size(); ++row)
{
for ( ; row < myEntries.get(row)[column]; ++column)
{
/* do stuff */;
}
}
}
这将解决您询问的问题,在某些情况下可能是合理的。但在你的情况下,它碰巧会产生第二个问题(见下一段)。所以我想说有更好的方法(参见下面的“解决方案”部分)。
在您的情况下这不起作用的原因是因为您使用的是continue <label>
语句。问题是它将完全跳过,从而阻止每个for
循环的更新语句执行。除非您有 非常 使用continue <label>
或break <label>
声明,否则不要。像这样跳过你的代码会导致各种难以诊断的问题。而且它通常是一个基本设计错误的标志。
如果您认为必须使用continue <label>
或break <label>
语句,那么您可能需要重构(即重新构造代码,以便您不需要在第一次使用它时位)。
基本上,你要做的是下面的一些变化,以便遍历每一行,并在每一行内迭代每一列:
for (int row = 0; row < myEntries.size(); ++row)
{
for (int column = 0; column < myEntries.get(row).length; ++column)
{
/* do stuff */;
}
}
你的“东西”在哪里:
if (!isInteger(myEntries.get(row)[column]))
{
mark12Map.put(mark12Line.split(",")[0], myEntries.get(row)[column]);
}
但令人困惑的是,您还必须阅读并验证每行的一行:
if ((mark12Line = mark12Br.readline()) != null)
{
/* process each column in the row */;
}
那你把它放在哪里?就在“row”for
循环内部(以便为每行读取一行)并在“column”for
循环之外(因为每一行中有多列):
for (int row = 0; row < myEntries.size(); ++row)
{
if ((mark12Line = mark12Br.readline()) != null)
{
for (int column = 0; column < myEntries.get(row).length; ++column)
{
/* do stuff */;
}
}
}
这将完成工作,但需要的时间比需要的时间长。我们可以优化这一点,如果我们注意到每当没有更多的行要读取时,即使我们还没有达到最大行数,我们也会完成。因此,我们将以下else
块添加到行中的if
:
else
{
break; // break out of outer loop because there are no more lines to read
}
综合以上所有内容,最终产品如下所示:
for (int row = 0; row < myEntries.size(); ++row)
{
if ((mark12Line = mark12Br.readline()) != null)
{
for (int column = 0; column < myEntries.get(row).length; ++column)
{
if (!isInteger(myEntries.get(row)[column]))
{
mark12Map.put(mark12Line.split(",")[0], myEntries.get(row)[column]);
}
}
}
else
{
break;
}
}
答案 1 :(得分:1)
我不确定您是否以最恰当的方式处理问题,但回答的问题是您错误地声明了变量
//While the text file's line is not empty
int row = 0;
int column = 0
whileloop: while ((mark12Line = mark12Br.readLine()) != null)
{
//Declaring row, this keeps getting reset
for (; row < myEntries.size(); row++)
{
//Declaring column, this also keeps getting reset
for (; column < myEntries.get(row).length; column++)
{
//While the row and column is not an integer
/*while*/ if (!isInteger(myEntries.get(row)[column]))
{
//Put the value in position row and column into the map.
mark12Map.put(mark12Line.split(",")[0], myEntries.get(row)[column]);
//continue whileloop;
}
}
}
}