Menu
CoddyTech

Pola Iterator

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 76 dari 87.

Iterator Pattern adalah pola desain perilaku yang menyediakan cara untuk mengakses elemen koleksi secara berurutan tanpa mengekspos struktur dasarnya. Baik kamu bekerja dengan array, linked list, maupun tree, iterator memberimu cara yang seragam untuk menelusuri elemen-elemennya.

Pola ini memisahkan logika penelusuran dari koleksi itu sendiri. Pola ini melibatkan dua komponen utama: antarmuka Iterator yang mendefinisikan method untuk menelusuri elemen, dan Iterable (atau Aggregate) yang membuat iterator untuk koleksinya:

interface Iterator<T> {
    boolean hasNext();
    T next();
}

interface Container<T> {
    Iterator<T> createIterator();
}

class BookShelf implements Container<String> {
    private String[] books;
    private int count = 0;
    
    public BookShelf(int size) {
        books = new String[size];
    }
    
    public void addBook(String book) {
        books[count++] = book;
    }
    
    public Iterator<String> createIterator() {
        return new BookIterator();
    }
    
    private class BookIterator implements Iterator<String> {
        private int index = 0;
        
        public boolean hasNext() {
            return index < count;
        }
        
        public String next() {
            return books[index++];
        }
    }
}

Iterator menyimpan status penelusurannya sendiri, sehingga beberapa iterator dapat menelusuri koleksi yang sama secara mandiri. Client menggunakan iterator tanpa mengetahui cara koleksi menyimpan datanya:

BookShelf shelf = new BookShelf(3);
shelf.addBook("Design Patterns");
shelf.addBook("Clean Code");

Iterator<String> iterator = shelf.createIterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

Interface bawaan Java Iterable dan Iterator mengikuti pola yang persis ini, sehingga kamu bisa menggunakan for-loop yang disempurnakan dengan class apa pun yang mengimplementasikan Iterable. Iterator Pattern penting saat kamu perlu menyediakan beberapa cara penelusuran atau menyembunyikan struktur internal yang kompleks dari kode client.

challenge icon

Tantangan

Mudah

Mari kita buat sistem playlist menggunakan Pola Iterator! Kamu akan membuat playlist musik yang menyimpan lagu dan menyediakan iterator khusus untuk menelusurinya secara berurutan, tanpa mengungkapkan cara lagu disimpan secara internal. Ini adalah kasus penggunaan yang tepat untuk Pola Iterator, yang memungkinkan pengguna menelusuri koleksimu melalui antarmuka yang rapi dan seragam.

Kamu akan mengatur kodemu dalam empat file:

  • Iterator.java: Definisikan antarmuka generik Iterator<T> dengan dua method: hasNext() yang mengembalikan boolean untuk menunjukkan apakah masih ada elemen, dan next() yang mengembalikan elemen berikutnya bertipe T.
  • Playlist.java: Buat class agregat yang menyimpan lagu-lagumu. Playlist milikmu harus menyimpan lagu dalam array String dengan kapasitas tetap (diberikan ke constructor) dan mencatat jumlah lagu yang telah ditambahkan. Sertakan method addSong(String song) untuk menambahkan lagu ke playlist.

    Playlist milikmu memerlukan method createIterator() yang mengembalikan Iterator<String>. Implementasikan ini dengan membuat inner class privat bernama PlaylistIterator yang mengimplementasikan antarmuka Iterator-mu. Iterator ini menyimpan posisi indeksnya sendiri dan menelusuri array lagu, lalu mengembalikan setiap lagu secara berurutan.

  • Song.java: Buat class Song sederhana yang membungkus judul lagu. Class ini harus memiliki constructor yang menerima judul (String), method getTitle(), dan method toString() yang mengembalikan Playing: [title].
  • Main.java: Satukan sistem iterator-mu! Kamu akan menerima satu input: daftar judul lagu yang dipisahkan koma (contohnya: Bohemian Rhapsody,Stairway to Heaven,Hotel California).

    Buat Playlist dengan kapasitas 10 lagu. Uraikan input dan tambahkan setiap judul lagu ke playlist. Kemudian, ambil iterator dari playlist dan gunakan untuk menelusuri semua lagu, dengan mencetak setiap lagu yang dibungkus dalam object Song (yang akan ditampilkan sebagai Playing: [title]).

    Setelah menelusuri semua lagu, cetak Playlist complete! pada baris baru.

Kamu akan menerima satu input: string berisi judul lagu yang dipisahkan koma.

Contohnya, dengan input Yesterday,Imagine,Let It Be, output-mu akan seperti ini:

Playing: Yesterday
Playing: Imagine
Playing: Let It Be
Playlist complete!

Perhatikan bagaimana class Main menggunakan method iterator hasNext() dan next() untuk menelusuri playlist tanpa mengetahui apa pun tentang struktur array yang mendasarinya. Iterator merangkum semua logika penelusuran, sehingga representasi internal koleksi tetap tersembunyi dari kode client!

Coba sendiri

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        
        // TODO: Buat Playlist dengan kapasitas 10 lagu
        
        // TODO: Pisahkan input berdasarkan koma, lalu tambahkan setiap judul lagu ke playlist
        
        // TODO: Dapatkan iterator dari playlist menggunakan createIterator()
        
        // TODO: Gunakan iterator untuk menelusuri semua lagu
        // Untuk setiap lagu, bungkus dalam object Song lalu cetak object tersebut
        
        // TODO: Cetak "Playlist complete!" setelah menelusuri semua lagu
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online