codestory

Die Anleitung zu Java ListIterator

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

1. ListIterator

ListIterator ist eine Unter-Interface von Iterator. Das ist eine der Möglichkeiten, die Elemente einer List zu durchlaufen (traverse). Im Gegensatz zu Iterator unterstützt ListIterator das Durchlaufen von Elementen sowohl in Vorwärts- als auch in Rückwärtsrichtung. ListIterator unterstützt auch das Entfernen, Aktualisieren oder Einfügen eines Element bei Iteration.
public interface ListIterator<E> extends Iterator<E>
Unten ist das der Vergleich zwischen Iterator und ListIterator:
Iterator
ListIterator
Wird verwendet, um die Elemente einer Collection zu durchlaufen.
wird verwendet, um die Elemente eines List zu durchlaufen.
Unterstützt bei Durchlaufen der Elemente in Vorwärtsrichtung.
Unterstützt bei Durchlaufen der Elemente in Rückwärtsrichtung.
Kann das Entfernen eines Elements bei Iteration unterstützen (abhängig vom Typ Collection)
Kann das Entfernen, Aktualisieren oder Einfügen eines Element bei Iteration (abhängig vom Typ von List).
Die Iterationsreihenfolge der Elemente ist nicht garantiert.
Die Iterationsreihenfolge der Elemente ist garantiert.
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

Z.B: Verwenden Sie ListIterator zum Durchlaufen des Elemente einer 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()

Während Sie die Elemente einer Collection mit einem Iterator durchlaufen,können Sie das aktuelle Element aus der Collection entfernen. Mit der Methode Iterator.remove() können Sie das machen. Allerdings unterstützen nicht alle Iterator diesen Vorgang, dies hängt vom Typ von Collection ab. Wenn dies nicht unterstützt wird, wird UnsupportedOperationException ausgelöst.
Hinweis: Die Methode remove() wird von Iterator geerbt.
// Optional operation
// Inherited from Iterator interface
public void remove()
Z.B: Eine List enthält die Integers. Entfernen Sie die Elemente aus der Liste, um sicherzustellen, dass die Liste nur die steigenden Integers enthält.
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)

Während Sie die Elemente einer List mit einem ListIterator durchlaufen, können Sie das aktuelle Element aktualisieren. Mit der Methode ListIterator.set(E) können Sie dies tun. Allerdings unterstützen nicht alle ListIterator diesen Vorgang, dies hängt vom Typ von List ab. Wenn nicht unterstützt, wird UnsupportedOperationException ausgelöst.
public void set(E e)
Z.B: Eine List enthält die Integers. Wenn eine Element der Liste eine negative Integer ist, muss es durch 0 ersetzt werden.
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
Ein Beispiel über eine Liste (List) , die die Operation ListIterator.set nicht unterstützt:
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)

Während Sie die Elemente einer List mit einem ListIterator durchlaufen, könenn Sie ein Element in List einfügen. Mit der Methode ListIterator.add(E) können Sie dies tun. Allerdings unterstützen nicht alle ListIterator diesen Vorgang, dies hängt vom Typ von List ab. Wenn nicht unterstützt, wird UnsupportedOperationException ausgelöst.
public void add(E e);
Zum Beispiel:
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
Ein Beispiel über eine List, die den Vorgang ListIterator.add nicht unterstützt:
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()