错误的输出节点数据发生在使用 for 循环时



我想在每个数组中放置一个节点,该节点将包含我的输入.txt文件中的数据。所以我使用 for 循环将数据从输入.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();
        }
    }
}
            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; 
        }

这个地方。你不能像这样初始化。节点数组 [i] = 空。因为它将引用同一个对象。chage to NodeArray [i] = new Node();

您需要了解,当您初始化对象时,例如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.VertexAempty.VertexB等。

循环的每次迭代你都会改变同一个对象,这就是你得到输出的原因

3 0 -4 (输入) 3 0 -4 (输入) 3 0 -4 (输入) 3 0

-4 (输入) 3 0 -4 (输入)

因为,这些是在循环的最后一次迭代中为对象empty输入的值。

我希望这很有帮助,现在您知道如何解决问题(为数组中的每个元素创建新的对象Node())。

最新更新