openplanning

Hướng dẫn và ví dụ Java ListIterator

Xem thêm các chuyên mục:

Hãy theo dõi chúng tôi trên Fanpage để nhận được thông báo mỗi khi có bài viết mới. Facebook

1- ListIterator

ListIterator là một interface con của Iterator. Nó là một trong các cách giúp bạn duyệt qua (traverse) các phần tử của một List. Khác với Iterator, ListIterator hỗ trợ duyệt qua các phần tử theo cả 2 hướng tiến và lùi. ListIterator cũng hỗ trợ loại bỏ, cập nhập hoặc chèn một phần tử trong quá trình lặp.

public interface ListIterator<E> extends Iterator<E>
Dưới đây là so sánh giữa IteratorListIterator:
Iterator ListIterator
Được sử dụng để duyệt qua các phần tử của một Collection. Được sử dụng để duyệt qua các phần tử của một List.
Hỗ trợ duyệt qua các phần tử theo hướng tiến. Hỗ trợ duyệt qua các phần tử theo hướng tiến và lùi.
Có thể hỗ trợ việc loại bỏ một phần tử trong quá trình lặp (Tuỳ thuộc vào loại Collection) Có thể hỗ trợ việc loại bỏ, cập nhập hoặc chèn một phần tử trong quá trình lặp (Tuỳ thuộc vào loại List).
Không đảm bảo thứ tự lặp của các phần tử. Đảm bảo thứ tự lặp của các phần tử.
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

Ví dụ: Sử dụng ListIterator để duyệt qua các phần tử của một 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()

Trong quá trình đi qua (traverse) các phần tử của một Collection sử dụng Iterator, bạn có thể loại bỏ phần tử hiện tại ra khỏi Collection. Phương thức Iterator.remove() cho phép bạn làm điều đó. Tuy nhiên không phải tất cả các Iterator đều hỗ trợ hoạt động này, nó phụ thuộc vào kiểu Collection. Nếu không được hỗ trợ UnsupportedOperationException sẽ được ném ra.
Chú ý: Phương thức remove() được thừa kế từ Iterator.

// Optional operation
// Inherited from Iterator interface
public void remove()
Ví dụ: Một danh sách (List) chứa các số nguyên, loại bỏ các phần tử trong danh sách để đảm bảo rằng danh sách đó chỉ bao gồm các số nguyên tăng dần.
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)

Trong quá trình đi qua (traverse) các phần tử của một List sử dụng ListIterator, bạn có thể cập nhập phần tử hiện tại. Phương thức ListIterator.set(E) cho phép bạn làm điều đó. Tuy nhiên không phải tất cả các ListIterator đều hỗ trợ hoạt động này, nó phụ thuộc vào kiểu List. Nếu không được hỗ trợ UnsupportedOperationException sẽ được ném ra.

public void set(E e)
Ví dụ: Một danh sách (List) chứa các số nguyên, nếu một phần tử của danh sách là số nguyên âm nó cần được thay thế bởi số 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
Ví dụ về một danh sách (List) không hỗ trợ hoạt động 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)

Trong quá trình đi qua (traverse) các phần tử của một List sử dụng ListIterator, bạn có thể chèn một phần tử vào List. Phương thức ListIterator.add(E) cho phép bạn làm điều đó. Tuy nhiên không phải tất cả các ListIterator đều hỗ trợ hoạt động này, nó phụ thuộc vào kiểu List. Nếu không được hỗ trợ UnsupportedOperationException sẽ được ném ra.

public void add(E e);
Ví dụ:
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
Ví dụ về một List không hỗ trợ hoạt động 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()

Xem thêm các chuyên mục: