Java: сбросить ListIterator? - PullRequest
       10

Java: сбросить ListIterator?

4 голосов
/ 27 января 2010

Мне нужно пройти LinkedList несколько раз, что предполагает использование ListIterator.

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

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

Ответы [ 4 ]

3 голосов
/ 27 января 2010

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

2 голосов
/ 03 декабря 2010

Похоже, AbstractList.listIterator(int initialPos) - это то, что я хочу использовать для ArrayList, а LinkedList.descendingIterator() - это то, что я хочу использовать для LinkedList, но там не отображается быть единым методом, который будет эффективно применяться к обоим, и downndingIterator () возвращает итератор, а не 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());

    }
}
1 голос
/ 27 января 2010

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

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

1 голос
/ 27 января 2010

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

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

...