我想在每个数组中放置一个Node,Node将包含来自input.txt文件的数据。所以我使用for循环从input.txt文件中获取数据到EdgeArray。
但结果显示为3 0 -4(输入)3 0 -4(输入)3 0 -4(输入)3 0 -4(输入)3 0 -4(输入)
我的输入文件的数据如4 5(输入)0 1 -3(输入)1 2 -2(输入)0 2 0(输入)3 2 -1(输入)3 0 -4(输入)。
所以结果必须像0 1 -3(输入)1 2 -2(输入)0 2 0(输入)3 2 -1(输入)3 0 -4(输入)
出了什么问题,我该怎么做才能解决这个问题?
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Assignment51 {
public static void main(String[] args) throws IOException {
BufferedReader in;
try {
in = new BufferedReader(new FileReader("input.txt"));
String graphGuide;
graphGuide = in.readLine();
String divider[] = graphGuide.split(" "); //공백을 구분자로 지정하기
int NodeNum = Integer.parseInt(divider[0]); //Node갯수
int EdgeNum = Integer.parseInt(divider[1]); //Edge갯수
Node empty = new Node();
Node [] NodeArray = new Node [NodeNum];
for(int i = 0; i < NodeNum; i++){
NodeArray [i] = empty;
}
Node [] EdgeArray = new Node [EdgeNum];
for(int i = 0; i < EdgeNum; i++){
EdgeArray [i] = empty;
}
for(int i = 0; i < EdgeNum; i++){
String temp;
temp = in.readLine();
String divider2[] = temp.split(" ");
int v1 = Integer.parseInt(divider2[0]);
int v2 = Integer.parseInt(divider2[1]);
int weight = Integer.parseInt(divider2[2]);
EdgeArray[i].VertexA = v1;
EdgeArray[i].VertexB = v2;
EdgeArray[i].weight = weight;
}
for(int k = 0; k < EdgeNum; k++){
System.out.println(EdgeArray[k].VertexA + " " + EdgeArray[k].VertexB + " " + EdgeArray[k].weight);
}
KruskalsAlgorithm(EdgeArray, EdgeNum);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:0)
Node empty = new Node();
Node [] NodeArray = new Node [NodeNum];
for(int i = 0; i < NodeNum; i++){
NodeArray [i] = empty;
}
Node [] EdgeArray = new Node [EdgeNum];
for(int i = 0; i < EdgeNum; i++){
EdgeArray [i] = empty;
}
这个地方。你不能像这样初始化.NodeArray [i] =空。因为它会引用同一个对象。 chage to NodeArray [i] = new Node();
答案 1 :(得分:0)
您需要了解初始化对象时,如Node empty = new Node();
此对象是在堆中创建的,而引用empty
指向它。
当你做出这样的循环时:
Node [] EdgeArray = new Node [EdgeNum];
for(int i = 0; i < EdgeNum; i++){
EdgeArray [i] = empty;
}
这意味着您使用empty
引用的同一对象初始化数组中的每个元素。
所以,稍后,当你写这样的东西时:
EdgeArray[i].VertexA = v1;
EdgeArray[i].VertexB = v2;
EdgeArray[i].weight = weight;
实际发生的是,EdgeArray[i].VertexA
引用存储在堆中的empty
对象,因此它等同于empty.VertexA
,empty.VertexB
等等上。
循环的每次迭代都会改变同一个对象,这就是你获得输出的原因
3 0 -4(输入)3 0 -4(输入)3 0 -4(输入)3 0 -4(输入)3 0 -4 (输入)
因为,这些是您在循环的最后一次迭代中输入到empty
对象的值。
我希望这有用,现在您知道如何解决问题(为数组中的每个元素创建新对象Node()
)。