我正在尝试使用邻接矩阵结构来表示Ad Hoc网络。为此,我在另一个ArrayList中创建一个ArrayList。
当我向图形添加一个新顶点时,我创建了一个新的ArrayList(在一个超级ArrayList中)然后我有一个循环来为每个ArrayList添加一个新的null对象,但是ArrayLists的大小没有正确增加我无法弄清楚原因。
这是我的代码:
public class Matrix {
public ArrayList<ArrayList<Edge>> graph;
public ArrayList<Vertex> verticies;
public ArrayList<Edge> edges;
public Matrix() {
graph = new ArrayList();
verticies = new ArrayList();
edges = new ArrayList();
}
public Matrix(ArrayList<Vertex> verticies, ArrayList<Edge> edges) {
this.verticies = verticies;
this.edges = edges;
}
public void addVertex(Vertex v) {
verticies.add(v);
graph.add(new ArrayList());
for(int i=0; i<graph.size()-1; i++ ) {
graph.get(i).add(null);
}
}
非常感谢任何帮助。
答案 0 :(得分:3)
graph
的初始大小为0
,因此for
中的addVertex()
循环运行时间少于应有的时间:
public void addVertex(Vertex v) {
verticies.add(v);
graph.add(new ArrayList()); // graph now has size 1
for (int i = 0; i < graph.size() - 1; i++) { // i = 0, 0 < 0 is false
graph.get(i).add(null); // this is not executed for the last added list
}
}
下次您致电addVertex()
时,会将null
添加到之前的ArrayList
,但不会添加到您刚刚添加的for (int i = 0; i < graph.size(); i++)
。
所以你可能应该这样做:
addVertex()
即使使用此修复程序,请注意,如果您拨打index ArrayList
0 [null, null, null, null, null]
1 [null, null, null, null]
2 [null, null, null]
3 [null, null]
4 [null]
5次,您将会遇到以下情况:
public void addVertex(Vertex v) {
this.vertices.add(v);
}
这可能不是你想要的。更好的方法是首先添加所有顶点:
ArrayList
然后为适当大小的邻接矩阵创建public void initializeAdjacencyMatrix() {
int n = this.vertices.size();
for (int i = 0; i < n; i++) {
List<Edge> edges = new ArrayList<>(Collections.nCopies(n, null));
graph.add(edges);
}
}
s:
ArrayList
此外,您在实例化graph = new ArrayList<>();
graph.add(new ArrayList<>());
时使用原始类型。这不是一个好习惯。您应该使用钻石运算符。例如:
{{1}}
答案 1 :(得分:0)
在这一行:
for(int i=0; i<graph.size()-1; i++ ) {
删除-1
。由于-1在图形的大小为1时i
不会小于0,因此循环不会运行。如果循环没有运行,那么添加null
值的代码将无法运行。