Jika saya memiliki daftar yang berisi [alice, bob, abigail, charlie]
dan saya ingin menulis iterator sedemikian rupa sehingga mengulangi elemen yang dimulai dengan 'a', dapatkah saya menulis milik saya sendiri? Bagaimana saya bisa melakukan itu?
104
Jawaban:
Tentu. Sebuah iterator hanyalah implementasi dari
java.util.Iterator
antarmuka. Jika Anda menggunakan objek iterable yang sudah ada (katakanlah, aLinkedList
) darijava.util
, Anda harus membuat subkelasnya dan menggantiiterator
fungsinya sehingga Anda mengembalikan milik Anda sendiri, atau menyediakan sarana untuk membungkus iterator standar dalamIterator
contoh khusus Anda (yang mana memiliki keuntungan karena digunakan secara lebih luas), dll.sumber
Iterator
contoh khusus Anda ..." (dan terima kasih). :-)Opsi terbaik yang dapat digunakan kembali adalah dengan mengimplementasikan antarmuka Iterable dan mengganti metode iterator ().
Berikut adalah contoh kelas ArrayList yang mengimplementasikan antarmuka, di mana Anda mengganti metode Iterator ().
Kelas ini mengimplementasikan antarmuka Iterable menggunakan Generik . Mengingat Anda memiliki elemen pada array, Anda akan bisa mendapatkan instance dari Iterator, yang merupakan instance yang diperlukan yang digunakan oleh loop "foreach", misalnya.
Anda bisa membuat instance anonim dari iterator tanpa membuat perpanjangan Iterator dan memanfaatkan nilai currentSize untuk memverifikasi hingga ke tempat Anda dapat menavigasi array (katakanlah Anda membuat array dengan kapasitas 10, tetapi Anda hanya memiliki 2 elemen pada 0 dan 1). Instance akan memiliki penghitung pemiliknya di mana ia berada dan yang perlu Anda lakukan hanyalah bermain dengan hasNext (), yang memverifikasi apakah nilai saat ini bukan null, dan next (), yang akan mengembalikan instance dari currentIndex Anda. Di bawah ini adalah contoh penggunaan API ini ...
Jika mau, Anda juga dapat mengulanginya menggunakan instance Iterator:
Dokumentasi foreach terletak di http://download.oracle.com/javase/1,5.0/docs/guide/language/foreach.html . Anda dapat melihat implementasi yang lebih lengkap di kode google praktik pribadi saya .
Sekarang, untuk mendapatkan efek dari apa yang Anda butuhkan, saya pikir Anda perlu memasukkan konsep filter di Iterator ... Karena iterator bergantung pada nilai berikutnya, akan sulit untuk mengembalikan true pada hasNext (), dan kemudian filter implementasi next () dengan nilai yang tidak dimulai dengan karakter "a" misalnya. Saya pikir Anda perlu bermain-main dengan Interator sekunder berdasarkan daftar yang difilter dengan nilai-nilai dengan filter yang diberikan.
sumber
for instance
, apakah itu pelesetan?Contoh yang bagus untuk Iterable untuk menghitung faktorial
Kode pendek untuk Java 1.8
Kelas Iterable kustom
Kelas Iterator khusus
sumber
Ini adalah kode lengkap untuk menulis iterator sedemikian rupa sehingga iterasi elemen yang dimulai dengan 'a':
Kelas Iterator khusus
sumber
Anda dapat menerapkan Iterator Anda sendiri. Iterator Anda dapat dibuat untuk membungkus Iterator yang dikembalikan oleh List, atau Anda dapat menyimpan kursor dan menggunakan metode get (int index) List. Anda hanya perlu menambahkan logika ke metode Iterator Anda berikutnya DAN metode hasNext untuk memperhitungkan kriteria pemfilteran Anda. Anda juga harus memutuskan apakah iterator Anda akan mendukung operasi penghapusan.
sumber
Inilah jawaban lengkap dari pertanyaan tersebut.
ListIterator
adalah iterator untuk larik yang mengembalikan elemen yang dimulai dengan 'a'.NoSuchElementException
pengecualian yang valid .sumber