2010-01-27 6 views
4

Мне нужно пройти LinkedList несколько раз, чтобы предложить ListIterator.java: сброс ListIterator?

Есть ли способ сбросить ListIterator? или лучше просто создать новый? (А что, если я не могу, потому что у меня нет доступа к списку?) ​​

редактировать: и есть способ создать ListIterator, который указывает на конец списка? (Так что hasNext() является ложным, но я могу использовать previous() или hasPrevious())

ответ

1

Создать новую LinkedList на основе полученных ListIterator, так что вы можете получить как много итераторов из него, как вы хотите.

Редактировать: по второму вопросу, который вы отредактировали впоследствии, рассмотрите возможность сделать сначала Collections#reverse().

+0

ick, я не могу отменить список. тьфу. похоже, что итераторы Java не так хороши, как итераторы ST ST. –

1

Если вы можете просто создать новый, который, вероятно, будет вашим лучшим выбором.

Если вы не можете, по мере прохождения итератора списка, добавьте каждый элемент в новый список. Используйте этот новый список, чтобы создать listIterator в следующий раз, когда вам это нужно.

3

Когда дело доходит до производительности, вероятно, быстрее создать новый итератор. Если у вас нет списка, вы можете использовать hasPrevious() и previous() для перемещения назад, пока вы не разместите итератор в начале списка. В зависимости от реализации списка вы можете столкнуться с соответствующим воздействием на производительность, перемещаясь назад через итератор.

2

Похоже AbstractList.listIterator(int initialPos) это то, что я хочу использовать для ArrayList, и LinkedList.descendingIterator() является то, что я хочу использовать для LinkedList, но не кажется, единственный метод, который будет применяться эффективно как и descendingIterator () возвращает Итератор, а не ListIterator. убирайся.

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()); 

    } 
} 
Смежные вопросы