0

所以我有一个名为 Graph 的 ArrayList 有 8 个条目。条目 1 是对称为“源”的整数数组的引用,条目 2-8 是对称为“数据”的整数数组的引用。但是,我真正想做的只是将数据保存在“源”和“数据”中,而不是保存对它们的引用。现在正因为如此,更改“数据”会破坏“图形”,编辑存储在“图形”中的数据很麻烦。

在这一点上,我希望能够在 while/for 循环中一次从“Graph”中提取一个数据,将其存储到一个名为 temp 的整数数组中,修改 temp,然后将其存储回“Graph” ,但这不起作用,因为这最终意味着“Graph”中的每个条目都只是对“temp”的引用,它们最终都会具有相同的值,这当然是错误的。

在 Graph 中编辑数据或重建数据以便避免这个问题的好方法是什么?

这是代码。我正在从一个告诉我如何构建图表的文本文件中读取数据。

    BufferedReader br = new BufferedReader(new FileReader("graph.txt"));
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while(line.charAt(z)!=' '){
        sizeString=sizeString+line.charAt(z);
        z++;
    }
     size = Integer.valueOf(sizeString);
     int graph[][] = new int[size][size];

    while (line != null) {
        sb.append(line);
        sb.append("\n");
        line = br.readLine();
        z=0;
        if(line != null){
            while(line.charAt(z)!=' '){
                xString=xString+line.charAt(z);
                z++;
            }
            z++;
            while(line.charAt(z)!=' '){
                yString=yString+line.charAt(z);
                z++;
            }
            z++;
            while(z<line.length()){
                weightString=weightString+line.charAt(z);
                z++;
            }
            System.out.println(xString+yString+weightString);
            x=Integer.valueOf(xString);
            y=Integer.valueOf(yString);
            weight=Integer.valueOf(weightString);

            graph[x][y]=weight;
            xString="";yString="";weightString="";
            vertices++;     
        }
    }

    //Set non adjacent node weights to infinity
    ArrayList Graph = new ArrayList();
    int[] source = new int[2];
    int[] data = new int[2];

    source[0]=0;
    source[1]=-1;

    Graph.add(0,source);

    data[0]=99999;      //Represents 'infinity'
    data[1]=-1;         //No source node
    x=1;

    while(x<graph.length){
        Graph.add(x, data);
        x++;
    }
4

1 回答 1

1

好的,我将尝试根据您对评论的回复提供答案。我在您的示例代码中没有看到任何名为“temp”的变量,所以我假设您还没有尝试编写该部分。

List<int[]> Graph = new ArrayList<int[]>(8); //specify the capacity if it is fixed
//Your existing code that populates Graph here...
for (int[] temp : Graph) {
    //Do some operations on temp...
}

或者如果您只想对 Graph 的元素 1..n 进行操作:

for (int ii = 1; ii < Graph.size(); ii++) {
    int[] temp = Graph.get(ii);
    //Do some operations on temp...
}

此外,当您填充 Graph 时,如果您不想保存引用,则需要制作数组的副本然后存储它:

int[] srcCopy = new int[source.length];
System.arraycopy(source, 0, srcCopy, 0, source.length);

我还建议您使用不同的变量名而不是“Graph”。大写的标识符只能用于类/接口变量。

于 2012-11-19T20:23:02.110 回答