我有一个使用String的集合,我想创建具有String键和Node Object值的哈希映射。 这是我的代码
Set<String> cities = new HashSet<>();
Map<String, Node> allCity = new HashMap<>();
Iterator<String> c = cities.iterator();
while(c.hasNext()){
String name = c.next();
Node cit = new Node(name);
allCity.put(name, cit);
}
我的问题是当我首先从c迭代器中读取并正确创建新对象并将其放入哈希映射但是当我的哈希映射中创建第二个对象时,之前的对象值就像这样改变了
首先阅读 key =&#34;纽约&#34; Value = Node(节点的值是纽约)
第二次阅读 Key =&#34; Los Angles&#34; Value = Node(节点的值是Los Angles) 我第一次阅读纽约钥匙价值是改为洛杉矶。
myNode类
public class Node{
private static String city;
private static double pathCost;
private ArrayList<Edge> neighbours;
private Node parent;
public Node(String cityName){
city = cityName;
neighbours = new ArrayList<>();
}
public static String getValue() {
return city;
}
public static void setValue(String city) {
Node.city = city;
}
public static double getPathCost() {
return pathCost;
}
public static void setPathCost(double pathCost) {
Node.pathCost = pathCost;
}
public static String getCity() {
return city;
}
public static void setCity(String city) {
Node.city = city;
}
public ArrayList<Edge> getNeighbours() {
return neighbours;
}
public void setNeighbours(ArrayList<Edge> neighbours) {
this.neighbours = neighbours;
}
public void addNeighbours(Edge n){
this.neighbours.add(n);
}
public Node getParent() {
return parent;
}
public void setParent(Node parent) {
this.parent = parent;
}
@Override
public String toString() {
return city;
}
}
请帮帮我。
答案 0 :(得分:3)
那是因为您制作了city
(和pathCost
)字段static
。静态字段属于该类,而不属于此类的特定实例。每个节点都有一个特定的城市,因此您希望将城市字段设为实例字段,而不是静态字段。
答案 1 :(得分:1)
city
班级中的Node
成员是static
。这意味着所有 Node
共享相同的city
,并且当一个实例更新它时(例如,在构造函数中),更改适用于所有这些。
要解决此问题,您可以将city
更改为实例成员:
public class Node{
private String city;
...
答案 2 :(得分:0)
如果没有彻底查看,这里有一个重大错误:
private static String city;
city
是节点(即实例)数据,不应该是静态的。
由于在您的情况下它是静态的,所有节点共享city
的一个值,这很可能不是您想要的。这同样适用于pathCost
。