Perilaku aneh dari iterator Java

Saya mengalami masalah aneh saat menggunakan iterator Java.

Dalam fungsi tertentu, saya menerima objek iterable bernama filelist, dan saya melakukan hal berikut:

System.out.println("First iteration:");
for(Text t : filelist) System.out.println(t);
System.out.println("Second iteration:");
for(Text t : filelist) System.out.println(t);

dan hasilnya adalah:

First iteration:

file2.txt

file1.txt

file1.txt

Second iteration:

filelist bertipe Iterable<Text>. Saya bekerja dengan kerangka peta/pengurangan Hadoop.

Jadi pertanyaan saya adalah, mengapa daftar file kosong di loop kedua, padahal saya tidak mengubahnya di loop pertama?


person Caesar23    schedule 16.01.2016    source sumber
comment
Apa jenis filelist?   -  person Tunaki    schedule 16.01.2016
comment
Dapat diubah‹Teks›. Saya bekerja dengan kerangka hadoop map/reduce.   -  person Caesar23    schedule 16.01.2016
comment
Kode ini digunakan di kelas peredam, jadi karena saya menggunakan kerangka hadoop, saya berasumsi bahwa setiap peredam menerima objek Daftar‹Teks›. Kanan ?   -  person Caesar23    schedule 16.01.2016
comment
Daftar juga merupakan antarmuka. Tambahkan System.out.println(filelist.getClass().getName());, dan ceritakan apa yang Anda dapatkan. Meskipun demikian, apa pun jenisnya, kecuali struktur data yang mendasarinya diubah secara bersamaan, hal ini tidak akan pernah terjadi.   -  person JB Nizet    schedule 16.01.2016
comment
Nilai yang dikembalikan adalah : org.apache.hadoop.mapreduce.task.ReduceContextImpl$ValueIterable   -  person Caesar23    schedule 16.01.2016
comment
Tolong jangan menambahkan jawaban ke pertanyaan Anda. Jika jawaban di bawah mengatasi masalah Anda, Anda sebaiknya menerimanya.   -  person Makoto    schedule 16.01.2016


Jawaban (1)


Iterable mungkin mengembalikan iterator yang mungkin tidak dapat diulangi. Tidak ada apa pun di antarmukanya yang mengatakan tidak bisa. Jadi dalam kasus Anda sepertinya Iterable dirancang oleh penulis perpustakaan untuk hanya digunakan satu kali. Jika Anda ingin mengulangi untuk kedua kalinya, Anda perlu menyimpan nilai dalam struktur Anda sendiri. Yaitu. kamu bisa melakukannya terlebih dahulu

List<Text> myList = new ArrayList(filelist)
person Dzmitry Paulenka    schedule 16.01.2016
comment
Maksud Anda Iterable, bukan Iterator. Sebuah Iterator tidak pernah dapat diulangi. Memang benar dokumen Iterable tidak menyebutkan apa pun, tetapi saya belum pernah melihat Iterable yang hanya dapat diulang satu kali. Ini harus berupa Iterator atau Stream, bukan Iterable. - person JB Nizet; 16.01.2016
comment
Tetap saja Iterable baru saja mengembalikan iterator. Jadi, maksud saya, antarmuka itu tidak memaksakan Iterable agar setiap panggilan ke iterator() mengembalikan instance baru dan siap pakai. Dapat diubah hanya allows an object to be the target of the "foreach" statement - person Dzmitry Paulenka; 16.01.2016