我有这个代码用于实现BFS,如下所示:
for(int i = 0; i < adjList.length; i++)
{
if(adjList[i].get(0).name.equals(u.name))
{
for(Iterator <Vertex> it = adjList[i].iterator(); it.hasNext();)
{
Vertex node = it.next();
System.out.println("====="+node.name);
if(node.color.equals("WHITE"))
{
node.color = "GRAY";
node.distance = u.distance + 1;
node.pre = u;
Q.add(node);
}
}
u.color = "BLACK";
System.out.println();
}
}
我使用以下代码使用列表列表实现了邻接列表:
ArrayList<Vertex> adjList[] = (ArrayList<Vertex>[])new ArrayList[size];
并且邻接列表中存储的值为:
adjList[0].add(new Vertex("r"));
adjList[0].add(new Vertex("s"));
adjList[0].add(new Vertex("v"));
adjList[1].add(new Vertex("s"));
adjList[1].add(new Vertex("r"));
adjList[1].add(new Vertex("w"));
adjList[2].add(new Vertex("t"));
adjList[2].add(new Vertex("w"));
adjList[2].add(new Vertex("x"));
adjList[2].add(new Vertex("u"));
在迭代器循环中,我需要对象&#34; node&#34;存储除第一个值以外的每个连续值,是否可能?
答案 0 :(得分:2)
我建议使用辅助方法:
<T> Iterator<T> skipFirstIterator(Iterable<T> iterable) {
Iterator<T> it = iterable.iterator();
it.next();
return it;
}
并在for
- 循环标题中调用它。
该方法隐含地断言第一个元素的存在,否则抛出异常。鉴于你的程序逻辑,我相信它应该是这样的。如果您的列表可能合法地具有零元素,则只需替换
it.next();
与
if (it.hasNext()) it.next();
答案 1 :(得分:2)
为什么不使用subList()
:
for (Vertex node : adjList[i].subList(1, adjList[i].size())) {
//
}
注意你的代码不需要访问迭代器,所以foreach循环很好。
答案 2 :(得分:1)
有几种方法可以跳过迭代器的第一个元素。
例如:
boolean first = true;
for(Iterator <Vertex> it = adjList[i].iterator(); it.hasNext();) {
if (first) { // skip first
it.next();
first = false;
} else {
// handle the rest
}
}
答案 3 :(得分:1)
由于您遍历List<Vertext>
,因此可以使用此处描述的listIterator(int index)
方法:https://docs.oracle.com/javase/7/docs/api/java/util/List.html#listIterator(int)。所以你的实现看起来像这样:
for(int i = 0; i < adjList.length; i++) {
if(adjList[i].get(0).name.equals(u.name)) {
for(Iterator <Vertex> it = adjList[i].listIterator(1); it.hasNext();) {
System.out.println("====="+node.name);
if(node.color.equals("WHITE")) {
node.color = "GRAY";
node.distance = u.distance + 1;
node.pre = u;
Q.add(node);
}
}
u.color = "BLACK";
System.out.println();
}
}