Java“break”似乎破坏了两个嵌套for循环
这段代码从纯文本文件读入每一行(每一行都有一个整数数组的“列表”),并且基本上将它分解为单个整数,它们是存储在临时阵列中。文档的每一行必须排列成具有相同行数和列数的二维数组。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]完全被忽略。
你永远不会重置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);
}
}
现在只要宣称,他们实际上是需要的变量,并设置内部数组为他们所需要的尺寸。
这是一个很好的发现:) – 2016-05-16 17:07:55
这是一个非常简单的解决方案,我不会找到!我是新来的Java,因为它是。谢谢。 – galaxyphoenix67
@ galaxyphoenix67很高兴帮助。我在帖子中增加了一些建议,以便让代码更清晰并且不太可能中断(假设我正确理解了你的意图,如果不正确,那么就忽略它):D)。 – resueman