簡體   English   中英

使用for循環時發生錯誤的輸出節點數據

[英]wrong output Node data occurs while using for-loop

我想在每個數組中放置一個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(enter)1 2 -2(enter)0 2 0(enter)3 2 -1(enter)3 0 -4(enter)

有什么問題,我應該怎么解決?

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; 
        }

這個地方。 您不能像這樣初始化。NodeArray[i] =空。 因為它將引用相同的對象。 更改為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() )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM