2016-05-16 94 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