2016-12-16 32 views
0

我正在循環使用while和for循環的文本文件。爲什麼每次我繼續while循環時,我的變量都會被重置?

我的代碼的目標是遍歷我的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?我需要他們每次增加一個不同的線。

我是在聲明他們錯了,還是別的東西打破了我的代碼。

如果您需要更多的代碼,請讓我知道。

謝謝你的幫助。

+0

爲什麼在'myEntries'迭代過程中,在while循環中讀取來自'mark12Br'的行? '繼續while循環;''跳出'for'循環,'whileloop'的下一次循環再次從頭開始。 – user2357112

+0

我不確定如何從逗號分隔的角度抓取內容而不使用字符串數組列表。如何在不重置任何東西的情況下循環訪問while循環? – juiceb0xk

回答

2

從我從你的問題的描述理解和你的迴應保羅Guiheen的答案,我想下面的代碼可能會接近你的應用程序的預期邏輯:

/* EDITED ...see below */ 

問題

rowcolumn變量每個外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 */; 
} 

那麼你把它放在哪裏?就在「行」 for循環中(這樣你讀每行一個行),只是外面的「列」 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; 
    } 
} 
+0

你所說的一切都是完全合理的。我對Java相對陌生,正確地處理這個問題,正如你所回答的,似乎真的有幫助,所以我感謝你的幫助。 – juiceb0xk

+0

@ juiceb0xk我剛剛在一個更清潔的解決方案中編輯。它做同樣的事情,但使用更標準/可讀的結構。 – Travis

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; 
        } 
       } 
      } 
     } 
+0

感謝您的幫助,但行不會由於某種原因而增加,並且列在增加到1後不會回到0.因此,它只讀取第一行中的第二個值。 – juiceb0xk

+0

內循環條件錯誤 - 現在試試代碼 –

+0

我修正了這個問題,但是行仍然沒有從0遞增。 – juiceb0xk

相關問題