2016-05-16 69 views
1

這段代碼從純文本文件讀入每一行(每一行都有一個整數數組的「列表」),並且基本上將它分解爲單個整數,它們是存儲在臨時陣列中。文檔的每一行必須排列成具有相同行數和列數的二維數組。Java「break」似乎破壞了兩個嵌套for循環

使用「if」語句測試條件的代碼行應該只打破inner for循環,然後返回到外部循環,遞增i並移至該行中的下一個數組。

到目前爲止,我所擁有的代碼只會在每行中取第一個數組,將其放入2D數組的第一行,但會跳過該行中的所有其他數組,然後移至下一行,它在哪裏做同樣的事情。所以內循環只進行一次,但外循環不會增加。我讀過的每篇文章都說,嵌套for循環中的「break」只會退出內部循環。在這種情況下似乎並非如此。

那麼我怎樣才能確保外循環增量和行中的所有數組都佔了?

if (!thisLine.equals("*")) { 
       String [] firstSplit = thisLine.split(" "); 
       String [] secondSplit = new String [firstSplit.length * firstSplit.length]; 
       int [][] numbers = new int [firstSplit.length][firstSplit.length]; 
       int value = 0; 
       int count = 0; 
       for (int i = 0; i < firstSplit.length; i++) { 
        firstSplit[i] = firstSplit[i].replace("[", "").replace("]", ""); 
        secondSplit = firstSplit[i].split(","); 
        for (int j = 0; j < secondSplit.length; j++) { 
         value = Integer.parseInt(secondSplit[j]); 
         if (count >= firstSplit.length) { 
          break; 
         } 
         numbers[i][count] = value; 
         count++; 
         System.out.println(value); 
        } 
       } 
       System.out.println(Arrays.deepToString(numbers)); 
      } 

例如:有文件中的行讀取: [6,10,15,13] [16,2,14,7] [11,8,9,3] [5 ,4,1,12]

'firstSplit'會以空格分隔該行,從而生成一個長度爲4的數組。 然後括號將被刪除。 對於firstSplit中的每個項目,secondSplit會以逗號分隔它,從而生成長度爲16(個別整數)的數組。 secondSplit中的每個項目都會轉換爲一個整數並放置在如下數組中: 6 at [0] [0],10 at [0] [1],15 at [0] [2],13 at [ 0] [3]。

下一個數組[16,2,14,7]完全被忽略。

回答

9

你永遠不會重置count,所以一旦它變得高於firstSplit.length,之後的每一次重複都會立即break

您應該在最外面的for循環內移動count的初始化,以便在每次通過內循環後將其重置爲0

這應該可以解決您所看到的問題,但還有其他一些內容我認爲可以改進。您最初的聲明secondSplit是不必要的,因爲您在使用它之前總是爲其指定一個新值(firstSplit[i].split(","))。我建議刪除該聲明,並將外部循環內的行更改爲:String[] secondSplit = firstSplit[i].split(",");。這將避免不必要地分配一塊內存。其次,除非我不理解你的目標,否則當數組寬度與高度不同時,你會遇到問題。您只需要count,因爲您將numbers[i]的長度初始化爲firstSplit.length,而不是實際需要的大小。我想你的代碼改成這樣:

String [] firstSplit = thisLine.split(" "); 
int [][] numbers = new int [firstSplit.length][]; 
for (int i = 0; i < firstSplit.length; i++) { 
    firstSplit[i] = firstSplit[i].replace("[", "").replace("]", ""); 
    String[] secondSplit = firstSplit[i].split(","); 
    numbers[i] = new int[secondSplit.length]; 

    for (int j = 0; j < secondSplit.length; j++) { 
     int value = Integer.parseInt(secondSplit[j]); 
     numbers[i][j] = value; 
     System.out.println(value); 
    } 
} 

現在只要宣稱,他們實際上是需要的變量,並設置內部數組爲他們所需要的尺寸。

+1

這是一個很好的發現:) – 2016-05-16 17:07:55

+0

這是一個非常簡單的解決方案,我不會找到!我是新來的Java,因爲它是。謝謝。 – galaxyphoenix67

+0

@ galaxyphoenix67很高興幫助。我在帖子中增加了一些建議,以便讓代碼更清晰並且不太可能中斷(假設我正確理解了你的意圖,如果不正確,那麼就忽略它):D)。 – resueman