有没有办法在使用迭代器时跳过第一个节点?

时间:2014-11-21 10:39:12

标签: java iterator listiterator

我有这个代码用于实现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;存储除第一个值以外的每个连续值,是否可能?

4 个答案:

答案 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();
    }
}