gpt4 book ai didi

java - 如何避免 Java 将数据保存为引用时产生的问题?

转载 作者:行者123 更新时间:2023-12-01 15:02:19 25 4
gpt4 key购买 nike

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

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

在图表中编辑数据或重建数据以避免此问题的好方法是什么?

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

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

最佳答案

好的,我将尝试根据您对评论的回复提供答案。我在您的示例代码中没有看到任何名为“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...
}

此外,当您填充图表时,如果您不想保存引用,则需要复制该数组,然后将其存储:

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

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

关于java - 如何避免 Java 将数据保存为引用时产生的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13460657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com