为什么每次继续while循环时我的变量都会被重置?

时间:2016-12-16 03:37:41

标签: java list csv dictionary treemap

我正在使用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循环,并且rowcolumn都已重置为0.所以它就好像它仍然在同一条线上,甚至虽然我已经在row++column++处增加了它。

为什么我的整数变量会一直重置为0?我需要它们每次增加一个不同的行。

我是在宣称它们是错的,还是其他东西破坏了我的代码。

如果您需要更多代码,请告知我们。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

根据我对您的问题描述和您对Paul Guiheen的回答的理解,我认为以下代码可能更接近您的应用程序的预期逻辑:

/* EDITED ...see below */

问题

每次外部row循环执行时,columnwhile变量都会被重置,因为它们正在内部 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;
                    }
                }
            }
        }