2010-01-27 55 views
4

我需要遍历LinkedList多次,建议使用ListIteratorjava:重置ListIterator?

有没有办法重置ListIterator?或者创建一个新的更好? (如果我不能,因为我没有什么访问列表?)

编辑:,是有办法来创建一个ListIterator指向列表的末尾? (使hasNext()是假的,但我可以用previous()hasPrevious()

回答

1

创建基于所获得的ListIteratorLinkedList,所以只要你想,你可以从它那里得到尽可能多的迭代器。

编辑:对于您之后编辑的第二个问题,请考虑先在列表中执行Collections#reverse()

+0

ick,我不能扭转列表。阿福。好像Java的迭代器不如C的STL迭代器好。 – 2010-01-27 16:44:46

1

如果你可以创建一个新的,可能是你最好的选择。

如果您不能,当您正在浏览列表迭代器时,将每个元素添加到新列表中。使用该新列表在下次需要时创建listIterator。

3

说到性能,创建一个新的迭代器可能会更快。如果您没有列表,您仍然可以使用hasPrevious()和previous()向后移动,直到您将迭代器放置在列表的开头。根据列表实现,您可能会遇到相关的性能影响,通过迭代器向后导航。

2

看起来像AbstractList.listIterator(int initialPos)是我想用于一个ArrayList,LinkedList.descendingIterator()是我想用于LinkedList,但似乎没有一种方法,将有效地适用于这两个,和descendingIterator( )返回一个Iterator,而不是一个ListIterator。 DRAT。

import java.util.AbstractList; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.ListIterator; 

public class ListIteratorTest { 
    static public void populate(List<Integer> list) 
    { 
     for (int i = 0; i < 10; ++i) 
     { 
      list.add(i*i); 
     }  
    } 
    static public void main(String[] args) 
    { 
     AbstractList<Integer> list = new ArrayList<Integer>(); 
     populate(list); 

     ListIterator<Integer> it;  
     System.out.println("List going forwards:"); 
     it = list.listIterator(); 
     while (it.hasNext()) 
      System.out.println(it.next()); 

     System.out.println("List going backwards:"); 
     it = list.listIterator(list.size()); 
     while (it.hasPrevious()) 
      System.out.println(it.previous()); 

     LinkedList<Integer> list2 = new LinkedList<Integer>(); 
     populate(list2); 
     System.out.println("List going forwards:"); 
     it = list2.listIterator(); 
     while (it.hasNext()) 
      System.out.println(it.next()); 

     System.out.println("List going backwards:"); 
     Iterator<Integer> it2 = list2.descendingIterator(); 
     while (it2.hasNext()) 
      System.out.println(it2.next()); 

    } 
}