一个
ArrayList
里面包含了一个
ArrayList
,可以将外部的对象看成是一个
ArrayList
就可以了。
ArrayList<ArrayList<Integer>> list2d = new ArrayList<ArrayList<Integer>>();
// add an element to the list
list2d.add(new ArrayList<Integer>());
// retrieve a list
ArrayList<Integer> list1d = list2d.get(0);
// add an integer
list2d.get(0).add(123);
顺便说一下,邻接表只是一组边的列表,不需要为每个顶点存储它们,特别是如果图是无向的。 一个
Edge
列表就足够了:
class Edge {
Vertex v1, v2;
}
ArrayList<Edge> adjacencyList;
如果您想按顶点存储它们,则可以通过将边封装在顶点类本身中来避免使用列表的列表,但这将需要两倍的边:
class Vertex {
int value;
ArrayList<Vertex> adjacency;
}
但哪种方法最好取决于您需要在图上执行的操作类型。对于小型图形,没有实际区别。
如果您只需要知道两个顶点是否相连,则可以使用另一种可能的实现:
class Edge {
public final int v1, v2;
public boolean equals(Object o) { return o != null && o instanceof Edge && o.hashCode() == hashCode(); }
public int hashCode() { return v1 ^ v2; }
}
Set<Edge> adjacencyList = new HashSet<Edge>();
ArrayList
,无论如何,您都会在顶点内使用集合作为邻接列表。如果性能至关重要,则无需进行O(n)查找,而可以进行O(1)查找。 - Jack