@ Finnw Saya tidak berpikir bahwa mereka adalah duplikat. Pertanyaan ini diajukan menggunakan Iterator, yang lainnya menggunakan for-each loop. Kedua soal tersebut diselesaikan dengan pendekatan yang serupa, jadi jawabannya adalah duplikat bukan soal.
Robert
Jawaban:
92
Gunakan variabel Anda sendiri dan tingkatkan dalam loop.
Terima kasih telah menyebutkan 'Pastikan Anda menelepon Indeks berikutnya SEBELUM Anda benar-benar mendapatkan indeks berikutnya ()'
Gangadhar JANNU
Terima kasih, saya tidak tahu tentang ini sebelumnya. Perhatian yang akan saya buat adalah ListIterator dua arah sedangkan Iterator searah. Selama Anda menghindari bergerak maju mundur dengan kursor yang efektif, maka Anda harus aman.
pengguna2910265
28
Berikut cara untuk melakukannya menggunakan variabel Anda sendiri dan membuatnya tetap ringkas:
List<String> list =Arrays.asList("zero","one","two");int i =0;for(Iterator<String> it = list.iterator(); it.hasNext(); i++){String s = it.next();System.out.println(i +": "+ s);}
Output (Anda dapat menebaknya):
0: zero
1: one
2: two
Keuntungannya adalah Anda tidak menaikkan indeks Anda di dalam loop (meskipun Anda harus berhati-hati untuk hanya memanggil Iterator # next sekali per loop - lakukan saja di atas).
Jika Anda membuat iterator sendiri, Anda juga dapat menggunakan ListIterator dan tidak memerlukan variabel int terpisah.
Robert Klemme
1
Jika Anda menggunakan 'impor statis' untuk Arrays.asList maka Anda cukup menulisasList("zero", "one", "two")
karmakaze
Persis seperti itulah yang saya lakukan sebelum saya membaca jawaban dari Paulus. Saya akan sangat mengecilkan cara Anda, karena saya tidak melihat keuntungan apa pun darinya. Apakah menurut Anda ada keuntungan (kecuali yang disebutkan). Mengapa Anda tidak menggunakan for-each loop? Mendefinisikan Iterator secara eksplisit tidak diperlukan, jika Anda menggunakan variabel Anda sendiri.
Willi Mentzel
@progressive_overload hanya jika Anda memerlukan Iterator (sesuai pertanyaan, misalnya untuk meneruskan ke perpustakaan), yang tidak ditampilkan contoh. Dalam contoh ini, Anda memiliki variabel di luar loop dan harus berhati-hati untuk memanggil #next sekali. Dalam contoh Paul tidak ada variabel di luar loop, tetapi Anda harus berhati-hati untuk memanggil #next dan #nextIndex bersama-sama sekali (dan dalam praktiknya, jika digunakan lebih dari sekali, mereka akan ditarik ke variabel lokal, yang contoh itu tidak ' t menunjukkan).
Tom Clift
23
Anda dapat menggunakan ListIteratoruntuk melakukan penghitungan:
finalList<String> list =Arrays.asList("zero","one","two","three");for(finalListIterator<String> it = list.listIterator(); it.hasNext();){finalString s = it.next();System.out.println(it.previousIndex()+": "+ s);}
Gunakan ListIterator untuk mengulangi Koleksi. Jika Koleksi bukan Daftar untuk memulai, gunakan Arrays.asList(Collection.toArray())untuk mengubahnya menjadi Daftar terlebih dahulu.
ListIterator<String> it = list1.listIterator();int index =-1;while(it.hasNext()){
index++;String value = it.next();//At this point the index can be checked for the current element.}
Antarmuka Iterator TIDAK memiliki metode nextIndex (). Anda perlu secara eksplisit menggunakan ListIterator untuk itu, tetapi OP mempertanyakan secara khusus tentang Iterator.
Fran Marzoa
0
Yang Anda butuhkan untuk menggunakannya adalah iterator.nextIndex () untuk mengembalikan indeks saat ini tempat iterator aktif. Ini bisa sedikit lebih mudah daripada menggunakan variabel penghitung Anda sendiri (yang masih berfungsi juga).
publicstaticvoid main(String[] args){String[] str1 ={"list item 1","list item 2","list item 3","list item 4"};List<String> list1 =newArrayList<String>(Arrays.asList(str1));ListIterator<String> it = list1.listIterator();int x =0;//The iterator.nextIndex() will return the index for you.while(it.hasNext()){int i = it.nextIndex();System.out.println(it.next()+" is at index"+ i);}}
Kode ini akan melalui list1 daftar satu item pada satu waktu dan mencetak teks item, lalu "ada di indeks" kemudian akan mencetak indeks yang ditemukan oleh iterator. :)
Sebenarnya, kode Anda dimatikan satu per satu karena mencoba menampilkan indeks SETELAH memanggilnya.next ().
Henrik Aasted Sørensen
0
Meskipun Anda sudah punya jawabannya, berpikir untuk menambahkan beberapa info.
Seperti yang Anda sebutkan Koleksi secara eksplisit, Anda tidak dapat menggunakan listIteratoruntuk mendapatkan indeks untuk semua jenis koleksi.
Antarmuka daftar - ArrayList, LinkedList, Vector dan Stack.
Memiliki keduanya iterator()danlistIterator()
Set antarmuka - HashSet, LinkedHashSet, TreeSet dan EnumSet.
Hanya memiliki iterator()
Antarmuka peta - HashMap, LinkedHashMap, TreeMap, dan IdentityHashMap
Tidak memiliki iterator, tetapi dapat diiterasi menggunakan keySet()/ values()atau entrySet()sebagai keySet()dan entrySet()kembali Setdan values()kembali Collection.
Jadi lebih baik digunakan iterators()dengan kenaikan nilai yang berkelanjutan untuk mendapatkan indeks saat ini untuk semua jenis koleksi.
Jawaban:
Gunakan variabel Anda sendiri dan tingkatkan dalam loop.
sumber
it.nextIndex()
. Berguna jika koleksi adalah List.Saya memiliki pertanyaan yang sama dan menemukan menggunakan ListIterator bekerja. Mirip dengan tes di atas:
Pastikan Anda memanggil nextIndex SEBELUM Anda benar-benar mendapatkan next ().
sumber
Berikut cara untuk melakukannya menggunakan variabel Anda sendiri dan membuatnya tetap ringkas:
Output (Anda dapat menebaknya):
Keuntungannya adalah Anda tidak menaikkan indeks Anda di dalam loop (meskipun Anda harus berhati-hati untuk hanya memanggil Iterator # next sekali per loop - lakukan saja di atas).
sumber
asList("zero", "one", "two")
Anda dapat menggunakan
ListIterator
untuk melakukan penghitungan:sumber
Koleksi seperti apa? Jika itu adalah implementasi dari antarmuka Daftar maka Anda bisa menggunakan
it.nextIndex() - 1
.sumber
Gunakan ListIterator untuk mengulangi Koleksi. Jika Koleksi bukan Daftar untuk memulai, gunakan
Arrays.asList(Collection.toArray())
untuk mengubahnya menjadi Daftar terlebih dahulu.sumber
lakukan saja seperti ini:
sumber
Gunakan int dan tingkatkan dalam loop Anda.
sumber
Lihat disini .
iterator.nextIndex()
akan memberikan indeks elemen yang akan dikembalikan oleh panggilan berikutnya kenext()
.sumber
Yang Anda butuhkan untuk menggunakannya adalah iterator.nextIndex () untuk mengembalikan indeks saat ini tempat iterator aktif. Ini bisa sedikit lebih mudah daripada menggunakan variabel penghitung Anda sendiri (yang masih berfungsi juga).
Kode ini akan melalui list1 daftar satu item pada satu waktu dan mencetak teks item, lalu "ada di indeks" kemudian akan mencetak indeks yang ditemukan oleh iterator. :)
sumber
Meskipun Anda sudah punya jawabannya, berpikir untuk menambahkan beberapa info.
Seperti yang Anda sebutkan Koleksi secara eksplisit, Anda tidak dapat menggunakan
listIterator
untuk mendapatkan indeks untuk semua jenis koleksi.Antarmuka daftar - ArrayList, LinkedList, Vector dan Stack.
Memiliki keduanya
iterator()
danlistIterator()
Set antarmuka - HashSet, LinkedHashSet, TreeSet dan EnumSet.
Hanya memiliki
iterator()
Antarmuka peta - HashMap, LinkedHashMap, TreeMap, dan IdentityHashMap
Tidak memiliki iterator, tetapi dapat diiterasi menggunakan
keySet()
/values()
atauentrySet()
sebagaikeySet()
danentrySet()
kembaliSet
danvalues()
kembaliCollection
.Jadi lebih baik digunakan
iterators()
dengan kenaikan nilai yang berkelanjutan untuk mendapatkan indeks saat ini untuk semua jenis koleksi.sumber
Ini akan menjadi solusi paling sederhana!
Diuji pada gcc-9 dengan
-std=c++11
benderaKeluaran:
sumber