Saya menggunakan Iterator untuk mengulang melalui koleksi dan saya ingin mendapatkan indeks elemen saat ini.
Bagaimana saya bisa melakukan itu?
Saya menggunakan Iterator untuk mengulang melalui koleksi dan saya ingin mendapatkan indeks elemen saat ini.
Bagaimana saya bisa melakukan itu?
Jawaban:
Gunakan variabel Anda sendiri dan tingkatkan dalam loop.
it.nextIndex()
. Berguna jika koleksi adalah List.
Saya memiliki pertanyaan yang sama dan menemukan menggunakan ListIterator bekerja. Mirip dengan tes di atas:
List<String> list = Arrays.asList("zero", "one", "two");
ListIterator iter = list.listIterator();
while (iter.hasNext()) {
System.out.println("index: " + iter.nextIndex() + " value: " + iter.next());
}
Pastikan Anda memanggil nextIndex SEBELUM Anda benar-benar mendapatkan next ().
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).
asList("zero", "one", "two")
Anda dapat menggunakan ListIterator
untuk melakukan penghitungan:
final List<String> list = Arrays.asList("zero", "one", "two", "three");
for (final ListIterator<String> it = list.listIterator(); it.hasNext();) {
final String s = it.next();
System.out.println(it.previousIndex() + ": " + s);
}
Koleksi seperti apa? Jika itu adalah implementasi dari antarmuka Daftar maka Anda bisa menggunakan it.nextIndex() - 1
.
Gunakan ListIterator untuk mengulangi Koleksi. Jika Koleksi bukan Daftar untuk memulai, gunakan Arrays.asList(Collection.toArray())
untuk mengubahnya menjadi Daftar terlebih dahulu.
lakukan saja seperti ini:
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.
}
Gunakan int dan tingkatkan dalam loop Anda.
Lihat disini .
iterator.nextIndex()
akan memberikan indeks elemen yang akan dikembalikan oleh panggilan berikutnya ke next()
.
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).
public static void main(String[] args) {
String[] str1 = {"list item 1", "list item 2", "list item 3", "list item 4"};
List<String> list1 = new ArrayList<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. :)
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()
atau entrySet()
sebagai keySet()
dan entrySet()
kembali Set
dan values()
kembali Collection
.
Jadi lebih baik digunakan iterators()
dengan kenaikan nilai yang berkelanjutan untuk mendapatkan indeks saat ini untuk semua jenis koleksi.