Java OOP – Iterator

Iterator trong Java được sử dụng trong Colleciton framework để truy xuất từng phần tử một. Nó là một trình vòng lặp phổ quát vì chúng ta có thể áp dụng nó cho bất kỳ đối tượng Colleciton. Bằng cách sử dụng Iterator, chúng ta có thể thực hiện cả thao tác đọc và xóa. Đây là phiên bản cải tiến của Enumeration với chức năng bổ sung là loại bỏ một phần tử.

Iterator phải được sử dụng bất cứ khi nào chúng ta muốn liệt kê các phần tử trong tất cả các giao diện được triển khai của Khung sưu tập như Set, List, Queue, Deque và tất cả các lớp đã triển khai của giao diện Map. Trình vòng lặp là con trỏ duy nhất có sẵn cho toàn bộ khung bộ sưu tập. Một đối tượng iterator có thể được tạo bằng cách gọi phương thức iterator() có trong giao diện Collection.

Iterator itr = c.iterator();

Các phương thức của Interface Iterator trong Java
Interface iterator định nghĩa ba phương thức như được liệt kê dưới đây:

  1. hasNext(): Trả về true nếu phép lặp có nhiều phần tử hơn.
public boolean hasNext();

2. next(): Trả về phần tử tiếp theo trong lần lặp. Nó ném ra NoSuchElementException nếu không còn phần tử nào nữa.

public Object next();

3. remove(): Loại bỏ phần tử tiếp theo trong lần lặp. Phương thức này chỉ có thể được gọi một lần cho mỗi lệnh gọi tới next().

public void remove();

Java Iterator hoạt động nội bộ như thế nào?

Trong phần này, chúng ta sẽ cố gắng hiểu cách Java Iterator và các phương thức của nó hoạt động nội bộ. Chúng ta hãy lấy đối tượng LinkedList sau đây để hiểu chức năng này.

List<String> cities = new LinkedList<>(); 
cities.add("G-1"); 
cities.add("G-2"); 
cities.add("G-3"); 
. 
. 
. 
cities.add("G-n");

Bây giờ chúng ta tạo một đối tượng Iterator trên đối tượng List như dưới đây:


Iterator<String> citiesIterator = cities.iterator();

Trình vòng lặp “cityIteartor” sẽ trông như thế này –

Java Iterator Step 1

Ở đây Con trỏ của Iterator đang trỏ trước phần tử đầu tiên của List.

Bây giờ chúng ta sẽ chạy đoạn mã sau.

citiesIterator.hasNext();
citiesIterator.next();
Java Iterator Step 2

Khi chúng ta chạy đoạn mã trên, Con trỏ của Iterator sẽ trỏ đến phần tử đầu tiên trong danh sách như trong sơ đồ trên.

Bây giờ chúng ta sẽ chạy đoạn mã sau.

citiesIterator.hasNext();
citiesIterator.next();
Java Iterator Step 3

Khi chúng ta chạy đoạn mã trên, Con trỏ của Iterator sẽ trỏ đến phần tử thứ hai trong danh sách như trong sơ đồ trên. Thực hiện quy trình này để đưa Con trỏ của Iterator đến phần tử cuối của Danh sách.

Java Iterator Step n

Sau khi đọc phần tử cuối cùng, nếu chúng ta chạy đoạn mã bên dưới, nó sẽ trả về giá trị “false”.

citiesIterator.hasNext();
Java Iterator at the end

Khi Con trỏ của Iterator trỏ đến phần tử sau phần tử cuối cùng của List, phương thức hasNext() trả về giá trị sai.

Note: Sau khi quan sát tất cả các sơ đồ này, chúng ta có thể nói rằng Java Iterator chỉ hỗ trợ Lặp lại hướng chuyển tiếp như trong sơ đồ bên dưới. Vì vậy nó còn được gọi là Con trỏ một chiều.

Working of java Iterator

Ví dụ:

// Java program to Demonstrate Iterator

// Importing ArrayList and Iterator classes
// from java.util package
import java.util.ArrayList;
import java.util.Iterator;

// Main class
public class Test {
    // Main driver method
    public static void main(String[] args)
    {
        // Creating an ArrayList class object
        // Declaring object of integer type
        ArrayList<Integer> al = new ArrayList<Integer>();

        // Iterating over the List
        for (int i = 0; i < 10; i++)
            al.add(i);

        // Printing the elements in the List
        System.out.println(al);

        // At the beginning itr(cursor) will point to
        // index just before the first element in al
        Iterator<Integer> itr = al.iterator();

        // Checking the next element  where
        // condition holds true till there is single element
        // in the List using hasnext() method
        while (itr.hasNext()) {
            //  Moving cursor to next element
            int i = itr.next();

            // Getting elements one by one
            System.out.print(i + " ");

            // Removing odd elements
            if (i % 2 != 0)
                itr.remove();
        }

        // Command for next line
        System.out.println();

        // Printing the elements inside the object
        System.out.println(al);
    }
}