数据被奇怪地覆盖,当我在Java中添加一个新对象到相同对象类型的数组



我有两个对象。其中一个名为"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是一个在需要时自动调整大小的数组,每次容量增加一倍。

  • 你把自己和drillerArraydrillingArray的名字混淆了。它们太相似了,你已经把它们混在你的代码里了。根据您的初始代码,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}

  1. 函数创建一个新的数组temp数组{,,,,,}
  2. for循环将在i < 3(初始)时进行迭代。
  3. 在第一次迭代中,它将一个元素复制到temp:{a,,,,,}.
  4. 并将currentDrillingArray重新分配为{a,,,,,}!这才是真正的bug
  5. 接下来,它将从替换的currentDrillingArray({a,,,,,})复制元素到temp({a,,,,,})。

最新更新