作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Java 中操作 ArrayList 的 ArrayList 时遇到问题。我的代码中有这个东西-
ArrayList<ArrayList<Integer>> L1 = new ArrayList<ArrayList<Integer>>();
问题是,我不知道该如何操作(添加、删除、遍历等)。我希望创建一个邻接表(用于实现简单的无向图),我的导师建议我应该创建一个 ArrayList 的 ArrayList。我知道我可以执行以下操作来添加新元素-
L1.add(//Something I want to add);
但由于显而易见的原因,这会在当前情况下引发错误。
最佳答案
一个 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; } // simple hash code, could be more sophisticated
}
Set<Edge> adjacencyList = new HashSet<Edge>();
关于java - 如何在 Java 中对 ArrayList 的 ArrayList 进行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19119655/
我是一名优秀的程序员,十分优秀!