gpt4 book ai didi

java - 如何修复在另一个类中修改的私有(private)列表

转载 作者:行者123 更新时间:2023-11-30 01:52:32 25 4
gpt4 key购买 nike

在一个学校项目中,他们要求我们制作迪杰斯特拉算法。我有类(class):节点、边缘、图形和 Dijkstra使用 graph.getNodes (返回一个列表)并将其存储在 findPath 的局部变量中(在 djikstra 中)使用find path graph.getnodes后返回一个大小为5的列表,而不是来自graph.java的getNodesfindPath 来自 Djikstra.java

public List<Node> getNodes() {
return nodes;
}

public void findPath (Node s, Node d) {
System.out.println("nodeSize at begining of findpath : "+graph.getNodes().size());
List<Node> nodes = graph.getNodes();
dijkstraTable = new Map[nodes.size()];
//verify paramaters
if(!nodes.contains(s)) throw new InvalidParameterException("the source node is not valid");
if(!nodes.contains(d)) throw new InvalidParameterException("the destination node is not valid");
if(s == null || d == null ) throw new NullPointerException("s or d are null");
Edge edge0 = new Edge(s,s,0);
Map<Node,Edge> map = new HashMap<Node,Edge>();
map.put(s, edge0);
int i =0;
dijkstraTable[i] = map;
//iteration > 0
while(!nodes.isEmpty()) {
i++;
if (i==nodes.size()) break;
Map<Node,Edge> newMap = new HashMap<Node,Edge>();
map = dijkstraTable[i-1]; //last iteration map
//get minimum last iteration
Node min = getMinimum(map);
//mark it as "visited"
nodes.remove(min);
//add it to the path
List<Edge> edges = graph.getEdgesGoingFrom(min);
System.out.println("nodeSize in loop: "+graph.getNodes().size());
for(Edge edge : edges) {
Node key = edge.getDestination();
if(!map.containsKey(key)) { //create it if doesnt exist
newMap.put(key, edge);
}else { //make sure to have the minimum value
if(getMinimum(map.get(key), edge) == edge) newMap.put(key, edge);
else newMap.put(key, map.get(key));
}
}//endfor
path.add(map.get(min));
dijkstraTable[i] = newMap;
}
System.out.println("nodeSize at end of findpath : "+graph.getNodes().size());
}

输出为

findpath 开头的节点大小:7

循环中的节点大小:6

循环中的节点大小:5

循环中的节点大小:5

循环中的节点大小:5

findpath 末尾的节点大小:5

每次都应该是7

最佳答案

您的问题在这里:

public List<Node> getNodes() {
return nodes;
}
...

List<Node> nodes = graph.getNodes();

您正在 findPath 方法中修改您的“私有(private)”列表。如果您想避免修改,请使用 Collections.unmodifyingList(nodes) int getNodes() 或在 findPath 中创建一个新列表并传递 graph.getNodes() 到列表构造函数。

关于java - 如何修复在另一个类中修改的私有(private)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55599957/

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