betacode

Руководство Java ListIterator

  1. ListIterator
  2. Example
  3. remove()
  4. set(E e)
  5. add(E e)
  6. nextIndex()
  7. previousIndex()

1. ListIterator

ListIterator - это подинтерфейс of Iterator. Это один из способов обхода (traverse) элементов List. В отличие от Iterator, ListIterator поддерживает перемещение элементов как в прямом, так и в обратном направлениях. ListIteratorтакже поддерживает удаление, обновление или вставку элемента во время итерации.
public interface ListIterator<E> extends Iterator<E>
Ниже приведено сравнение между Iterator и ListIterator:
Iterator
ListIterator
Используется для перебора элементов Collection.
Используется для перебора элементов List.
Поддерживает перемещение элементов в прямом направлении.
Поддерживает перемещение элементов в прямом и обратном направлениях.
Может поддерживать удаление элемента во время итерации (зависит от типа Collection)
Может поддерживать удаление, обновление или вставку элемента во время итерации (зависит от типа List).
Не гарантирует порядок итераций элементов.
Гарантирует порядок итераций элементов.
ListIterator methods
boolean hasPrevious()
E previous()

int nextIndex()
int previousIndex()
void set(E e) // Optional operation.
void add(E e) // Optional operation.

// Methods inherited from Iterator:
boolean hasNext()
E next();
default void remove() // Optional operation.
default void forEachRemaining(Consumer<? super E> action)

2. Example

Например: Использование ListIteratorдля обхода элементов List:
ListIteratorEx1.java
package org.o7planning.listiterator.ex;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListIteratorEx1 {

    public static void main(String[] args) {

        List<String> list = new ArrayList<String>();
        list.add("One");
        list.add("Two");
        list.add("Three");
        list.add("Four");

        // Create ListIterator.
        ListIterator<String> listIterator = list.listIterator();

        String first = listIterator.next();
        System.out.println("First:" + first);// -->"One"

        String second = listIterator.next();
        System.out.println("Second:" + second);// -->"Two"

        if (listIterator.hasPrevious()) {
            // Take a step back
            String value = listIterator.previous();
            System.out.println("Value:" + value);// -->"Two"
        }

        System.out.println(" ----- ");

        while (listIterator.hasNext()) {
            String value = listIterator.next();
            System.out.println("value:" + value);
        }
    }
}
Output:
First:One
Second:Two
Value:Two
 -----
value:Two
value:Three
value:Four

3. remove()

При обходе (traverse) элементов Collection с помощью Iterator, вы можете можно удалить текущий элемент из Collection. Метод Iterator.remove() позволяет это сделать. Однако не все Iterator поддерживают эту операцию, это зависит от типа Collection. Если он не поддерживается, будет выдано исключение UnsupportedOperationException.
Примечание: метод remove() наследуется от Iterator.
// Optional operation
// Inherited from Iterator interface
public void remove()
Например: Список (List) содержит целые числа, удалим элементы из списка, чтобы убедиться, что список содержит только увеличивающиеся целые числа.
ListIterator_remove_ex1.java
package org.o7planning.listiterator.ex;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListIterator_remove_ex1 {
    
    public static void main(String[] args)  {
        List<Integer> list= new ArrayList<Integer>();
        
        list.add(11);
        list.add(55);
        list.add(22);
        list.add(77);
        list.add(33);
        list.add(99);
        list.add(11);
        
        ListIterator<Integer> listIter = list.listIterator();
        
        int temp = listIter.next();
        
        while(listIter.hasNext())  {
            int current = listIter.next();
            
            if(current < temp)  {
                listIter.remove();
            } else {
                temp = current;
            }
        }
        
        for(Integer value: list)  {
            System.out.println(value);
        }
    }
}
Output:
11
55
77
99

4. set(E e)

При обходе (traverse) элементов List с помощью ListIterator, вы можетеобновить текущий элемент. Метод ListIterator.set(E) позволяет вам это сделать. Однако не все ListIterator поддерживают эту операцию, это зависит от типа List. Если не он поддерживается, будет выдано исключение UnsupportedOperationException.
public void set(E e)
Например: Список (List) содержит целые числа, если элемент списка является отрицательным целым числом, его необходимо заменить на 0.
ListIterator_set_ex1.java
package org.o7planning.listiterator.ex;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListIterator_set_ex1 {
    
    public static void main(String[] args)  {
        List<Integer> list= new ArrayList<Integer>();
        
        list.add(-111);
        list.add(555);
        list.add(-222);
        list.add(777);
        list.add(-333);
        list.add(999);
        list.add(111);
        
        ListIterator<Integer> listIter = list.listIterator();
        
        while(listIter.hasNext())  {
            int current = listIter.next();
            if(current < 0)  {
                listIter.set(0);
            }  
        }
        
        for(Integer value: list)  {
            System.out.println(value);
        }
    }
}
Output:
0
555
0
777
0
999
111
Пример списка (List), который не поддерживает операции ListIterator.set:
ListIterator_set_ex2.java
package org.o7planning.listiterator.ex;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;

public class ListIterator_set_ex2 {
    
    public static void main(String[] args)  {
        List<Integer> aList = Arrays.asList(-111, 555,-222,777,-333,999,111);
        
        // UnmodifiableList
        // This list does not support "set" operation!
        List<Integer> unmodifiableList = Collections.unmodifiableList(aList);
        
        ListIterator<Integer> listIter = unmodifiableList.listIterator();
        
        int current = listIter.next();
        
        listIter.set(1000); // throw UnsupportedOperationException
    }
}
Output:
Exception in thread "main" java.lang.UnsupportedOperationException
    at java.base/java.util.Collections$UnmodifiableList$1.set(Collections.java:1353)
    at org.o7planning.listiterator.ex.ListIterator_set_ex2.main(ListIterator_set_ex2.java:21)

5. add(E e)

При обходе (traverse) элементов List с помощью ListIterator, вы можете вставить элемент в List. Метод ListIterator.add(E) позволяет вам это сделать. Однако не все ListIterator поддерживают эту операцию, это зависит от типа List. Если он не поддерживается, будет выдано исключение UnsupportedOperationException.
public void add(E e);
Например:
ListIterator_add_ex1.java
package org.o7planning.listiterator.ex;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListIterator_add_ex1 {
    
    public static void main(String[] args)  {
        List<String> list= new ArrayList<String>();
        
        list.add("One");
        list.add("Two");
        list.add("Three");
        list.add("Four");
        list.add("Five");  
        
        ListIterator<String> listIter = list.listIterator();
        
        listIter.next(); // "One"
        listIter.next(); // "Two"
        listIter.next(); // "Three"
        listIter.previous(); // "Three"
        
        listIter.add("X1");
        
        
        for(String value: list)  {
            System.out.println(value);
        }
    }
}
Output:
One
Two
X1
Three
Four
Five
Пример List, который не поддерживает операцию ListIterator.add:
ListIterator_add_ex2.java
package org.o7planning.listiterator.ex;

import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;

public class ListIterator_add_ex2 {
    
    public static void main(String[] args)  {
        // Fixed-size List
        // It does not support add or set operation.
        List<String> list= Arrays.asList("One","Two","Three","Four","Five");  
        
        ListIterator<String> listIter = list.listIterator();
        
        listIter.next(); // "One"
        listIter.next(); // "Two"
        listIter.next(); // "Three"
        listIter.previous(); // "Three"
        
        listIter.add("X1"); // throw UnsupportedOperationException
    }
}
Output:
Exception in thread "main" java.lang.UnsupportedOperationException
    at java.base/java.util.AbstractList.add(AbstractList.java:153)
    at java.base/java.util.AbstractList$ListItr.add(AbstractList.java:451)
    at org.o7planning.listiterator.ex.ListIterator_add_ex2.main(ListIterator_add_ex2.java:19)

6. nextIndex()

public int nextIndex()

7. previousIndex()

public int previousIndex()