我有两个对象。其中一个名为"drillingRecords",包含两个数组,用于存储来自文件的已解析行信息。第二个标题为'drillingArray'包含一个数组来存储'drillingRecord'对象。目标是为文件中的每一行数据在'drillingArray[]'中存储一个'drillingArray'对象。(我知道他们应该大写,我只是按照给我的指示)
我正在读取文件,但是出现了一个奇怪的问题,其中数组在文件读取while循环中迭代时输出第一行一次,第二行两次,等等。该数组似乎覆盖了前一行的数据。我相信这是因为一旦我试图在while循环之外输出数据,它就会输出包含最后一行文件数据的10行。
下面是文件读取方法:String fileName = filePath;
drillingArray[] drillerArray = new drillingArray[10];
drillingRecord lineData;
drillingArray recordHolder;
BufferedReader br = new BufferedReader(new FileReader(fileName));
int lineCount= 0;
String line;
line = br.readLine();
while(line != null) {
line=br.readLine();
if(line != null) {
String[] lineString = line.split(",");
lineData = new drillingRecord(lineString);
recordHolder = new drillingArray();
recordHolder.add(lineData);
if( lineCount==drillerArray.length){
//possible issue in double drilling array although it does
//successfully double the size
drillerArray = doubleDrillingArray(drillerArray);
}
drillerArray[lineCount]= new drillingArray(recordHolder);
lineCount++;
}
}
printData(drillerArray);
}
双数组大小方法bc,这可能是一个问题,尽管它似乎工作
private static drillingArray[] doubleDrillingArray(drillingArray[] currentDrillingArray) {
int dbleSize = currentDrillingArray.length*2;
if (dbleSize > 0 && dbleSize < Integer.MAX_VALUE) {
drillingArray[] temp = new drillingArray[dbleSize];
for (int i = 0; i < currentDrillingArray.length; i++) {
temp[i] = currentDrillingArray[i];
currentDrillingArray = temp;
}
}else{
System.out.println("no space");
}
return currentDrillingArray;
}
和打印
的方法public static void printData(drillingArray[] array) {
for(int i = 0;i<array.length;i++) {
if(array[i] != null) {
System.out.println(array[i].data[0]);
}
else {
continue;
}
}
}
我不确定数据究竟在哪里被不经意地覆盖或复制,如果有更有经验的人能给我指出正确的方向,我将非常感激。如果您需要更多的信息,请告诉我。
注意事项:
-
我真的会放弃这些指导方针。在java中,类必须大写。
-
如果
dbleSize
是长,那么dbleSize < Integer.MAX_VALUE
是有意义的,但实际上您使用了int
。你知道如果给Integer.MAX_VALUE
加上+1会发生什么吗?它翻转过来,变成了Integer.MIN_VALUE
。所以,基本上,当你乘以*2
时,这个数字实际上会变小。我不是说这很可能发生,因为整数。MAX_VALUE确实是一个很大的数字。我只是说这张支票没有意义。 -
已经说过有复制数组的系统函数。如
System.arraycopy();
,它们也会更快。 -
实际上,你的代码是什么,正是一个
ArrayList
的行为。ArrayList是一个在需要时自动调整大小的数组,每次容量增加一倍。 -
你把自己和
drillerArray
和drillingArray
的名字混淆了。它们太相似了,你已经把它们混在你的代码里了。根据您的初始代码,drillerArray
包含drillingArray
元素。但是,您使用doubleDrillingArray
函数将drillerArray
的大小增加一倍。你把它们都混在一起了。这还不是bug
我个人不会做的事情
说了这么多,最让我困惑的是drillingArray
类。代码没有给出,但是…
recordHolder = new drillingArray();
...
drillerArray[lineCount]= new drillingArray(recordHolder);
所以,drillingArray
(实际上不是一个数组,而是一个类)可以用drillingArray
参数构造吗?构造函数用它做什么?它只是复制吗?
我的意思是,这不能只是
drillerArray[lineCount]= recordHolder; // without creating a new one
错误
实际上是在函数内部出了问题
currentDrillingArray = temp;
应下移一行。也就是说,它应该在for循环之外。你现在在每次迭代中分配这个。
由于前面的错误,周围的for循环的行为确实不可预测。源数组和目标数组会改变,循环时迭代的次数也会改变。
drillingArray[] temp = new drillingArray[dbleSize];
for (int i = 0; i < currentDrillingArray.length; i++) {
temp[i] = currentDrillingArray[i];
currentDrillingArray = temp;
}
让我们模拟一下:forcurrentDrillingArray
是{a, b, c}
。
- 函数创建一个新的数组
temp
数组{,,,,,}
- for循环将在
i < 3
(初始)时进行迭代。 - 在第一次迭代中,它将一个元素复制到
temp
:{a,,,,,}
. - 并将
currentDrillingArray
重新分配为{a,,,,,}
。!这才是真正的bug - 接下来,它将从替换的
currentDrillingArray
({a,,,,,}
)复制元素到temp
({a,,,,,}
)。