这是一个家庭作业程序,我正在研究算法课程。任务是使用列表矩阵模拟图形的邻接矩阵(这是Java btw)。矩阵的元素被解释为第一个节点。它在图中连接的任何节点都被添加到那个矩阵元素的列表中。我已经构造了这样的矩阵:
List<Node>[] weightedList = new List[size]
我知道对象列表和类型检查存在问题。然后我调用方法initializeList()
来构造初始结构。
protected void initializeList() {
List<Node> list = new ArrayList<Node>();
for (int i = 1; i < Tester.size; i++){
weightedList[i] = list;
}
}
当我处理输入数据时,我需要根据给定的节点值“构造”图形。我的问题在于,当我调用addEdge()
(实际上,连接两个节点创建一个Edge)时,我试图添加的节点被添加到矩阵的每个元素中。这是方法:
public static void putEdge(Edge e) {
Node node1 = e.getVertex1();
Node node2 = e.getVertex2();
int dim1 = node1.getNode();
if (dim1 < Tester.size){
weightedList[dim1].add(node2);
}
}
我的问题是否与对象列表或其他内容中固有的类型检查问题有关?请指教。
- JQK
答案 0 :(得分:1)
将相同的列表实例分配给数组的所有索引。
您应该在循环中实例化每个列表:
protected void initializeList() {
for (int i = 0; i < Tester.size; i++){
List<Node> list = new ArrayList<Node>();
weightedList[i] = list;
}
}
这样,数组中的每个索引都将包含一个不同的ArrayList
实例。
你可能应该从0开始迭代,因为它是数组的第一个索引。
答案 1 :(得分:0)
您在此处遇到的问题只是复制对象的引用,而不是对象本身。 @Eran的解决方案显示了如何为每个矩阵元素分配不同的列表。
答案 2 :(得分:0)
谢谢@Eran。你的解决方案是对的。我个人的错误。我还不能投票,我也不确定如何为你提供解决方案。
我的错误是initializeList()
这是@Eran提供的正确格式。
protected void initializeList() {
for (int i = 0; i < Tester.size; i++){
List<Node> list = new ArrayList<Node>();
weightedList[i] = list;
}
}