พฤติกรรมแปลก ๆ ของตัววนซ้ำ Java

ฉันพบปัญหาแปลก ๆ เมื่อใช้ตัววนซ้ำ Java

ในฟังก์ชันบางอย่างจะได้รับวัตถุที่ทำซ้ำได้ชื่อ filelist และฉันทำสิ่งต่อไปนี้:

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);

และผลลัพธ์คือ:

First iteration:

file2.txt

file1.txt

file1.txt

Second iteration:

filelist เป็นประเภท Iterable<Text> ฉันกำลังทำงานกับแผนที่ Hadoop/ลดเฟรมเวิร์ก

คำถามของฉันคือ ทำไมรายการไฟล์จึงว่างเปล่าในวงที่สอง ในเมื่อฉันไม่ได้เปลี่ยนมันในวงแรก


person Caesar23    schedule 16.01.2016    source แหล่งที่มา
comment
filelistเป็นประเภทใด   -  person Tunaki    schedule 16.01.2016
comment
ทำซ้ำได้‹ข้อความ› ฉันกำลังทำงานกับแผนที่ Hadoop/ลดเฟรมเวิร์ก   -  person Caesar23    schedule 16.01.2016
comment
รหัสนี้ใช้ในคลาสตัวลด ดังนั้นเนื่องจากฉันใช้เฟรมเวิร์ก Hadoop ฉันจึงสันนิษฐานว่าตัวลดแต่ละตัวจะได้รับวัตถุ List‹Text› ขวา ?   -  person Caesar23    schedule 16.01.2016
comment
รายการยังเป็นอินเทอร์เฟซ เพิ่ม System.out.println(filelist.getClass().getName()); และบอกว่าคุณได้อะไร ที่กล่าวว่าไม่ว่าจะเป็นประเภทใดก็ตาม เว้นแต่ว่าโครงสร้างข้อมูลพื้นฐานจะได้รับการแก้ไขไปพร้อมๆ กัน สิ่งนี้ไม่ควรเกิดขึ้น   -  person JB Nizet    schedule 16.01.2016
comment
ค่าที่ส่งคืนคือ: org.apache.hadoop.mapreduce.task.ReduceContextImpl$ValueIterable   -  person Caesar23    schedule 16.01.2016
comment
โปรดอย่าเพิ่มคำตอบในคำถามของคุณ หากคำตอบด้านล่างนี้แก้ปัญหาของคุณได้ คุณควรยอมรับคำตอบดังกล่าวแทน   -  person Makoto    schedule 16.01.2016


คำตอบ (1)


Iterable อาจส่งคืน iterator ที่อาจไม่สามารถทำซ้ำได้ ไม่มีสิ่งใดในอินเทอร์เฟซที่บอกว่าทำไม่ได้ ดังนั้นในกรณีของคุณ ดูเหมือนว่า Iterable ได้รับการออกแบบโดยผู้เขียนห้องสมุดให้ใช้งานได้เพียงครั้งเดียว หากคุณต้องการวนซ้ำครั้งที่สอง คุณต้องเก็บค่าไว้ในโครงสร้างของคุณเอง เช่น. คุณสามารถทำได้ก่อน

List<Text> myList = new ArrayList(filelist)
person Dzmitry Paulenka    schedule 16.01.2016
comment
คุณหมายถึง Iterable ไม่ใช่ Iterator Iterator ไม่สามารถทำซ้ำได้ เป็นเรื่องจริงที่เอกสาร Iterable ไม่ได้กล่าวถึงอะไรเลย แต่ฉันไม่เคยเห็น Iterable ใด ๆ ที่สามารถวนซ้ำได้เพียงครั้งเดียว ควรเป็นแบบ Iterator หรือ Stream แทนที่จะเป็น Iterable - person JB Nizet; 16.01.2016
comment
ยังคง Iterable เพียงส่งคืนตัววนซ้ำ ฉันหมายถึงว่าอินเทอร์เฟซนั้นไม่ได้บังคับให้ Iterable มีการเรียกทุกครั้งไปที่ iterator() คืนอินสแตนซ์ใหม่และพร้อมใช้งาน ทำซ้ำได้เพียง allows an object to be the target of the "foreach" statement - person Dzmitry Paulenka; 16.01.2016