เรามักจะใช้อินเทอร์เฟซวนซ้ำที่จัดทำโดย JDK เพื่อทำซ้ำคอลเลกชัน Java
ตัววนซ้ำ iterator = list.iterator (); ในขณะที่ (iterator.hasnext ()) {string string = iterator.next (); // ทำอะไร} การทำซ้ำสามารถเข้าใจได้ง่ายๆว่าเป็นการสำรวจ มันเป็นคลาสวิธีการที่สร้างมาตรฐานการเดินทางของวัตถุทั้งหมดในภาชนะต่าง ๆ มันเป็นรูปแบบการออกแบบทั่วไป รูปแบบตัววนซ้ำเป็นวิธีการเข้าถึงมาตรฐานที่ใช้ในการสำรวจคลาสคอลเลกชัน มันเป็นบทคัดย่อการเข้าถึงตรรกะจากคลาสคอลเลกชันประเภทต่าง ๆ ดังนั้นจึงหลีกเลี่ยงการเปิดเผยโครงสร้างภายในของคอลเลกชันไปยังไคลเอนต์ นี่คือวิธีที่เราจัดการกับมันเมื่อไม่มีตัววนซ้ำ ดังนี้:
สำหรับอาร์เรย์เราใช้ตัวห้อยเพื่อดำเนินการ:
int [] array = new int [10]; สำหรับ (int i = 0; i <array.length; i ++) {int a = array [i]; // ทำอะไร} นี่คือวิธีการจัดการ ArrayList:
รายการ <string> list = new ArrayList <String> (); สำหรับ (int i = 0; i <list.size (); i ++) {string string = list.get (i); // ทำอะไร} สำหรับทั้งสองวิธีเราจะรู้โครงสร้างภายในของคอลเลกชันล่วงหน้าเสมอ รหัสการเข้าถึงและคอลเลกชันนั้นมีความแน่นและไม่สามารถแยกตรรกะการเข้าถึงออกจากคลาสคอลเลกชันและรหัสไคลเอนต์ ในเวลาเดียวกันคอลเลกชันแต่ละรายการสอดคล้องกับวิธีการสำรวจและรหัสไคลเอนต์ไม่สามารถนำกลับมาใช้ใหม่ได้ ในการใช้งานจริงมันค่อนข้างลำบากในการรวมทั้งสองชุดข้างต้น ดังนั้นเพื่อแก้ปัญหาข้างต้นโหมดตัววนซ้ำจะว่างและใช้ตรรกะเดียวกันเสมอเพื่อสำรวจคอลเลกชัน สิ่งนี้ทำให้ลูกค้าไม่จำเป็นต้องรักษาโครงสร้างภายในของคอลเลกชันและสถานะภายในทั้งหมดได้รับการดูแลโดยตัววนซ้ำ ลูกค้าไม่เคยเกี่ยวข้องกับคลาสคอลเลกชันโดยตรง มันควบคุมตัววนซ้ำเสมอและส่ง "ไปข้างหน้า", "ย้อนกลับ" และ "ใช้องค์ประกอบปัจจุบัน" ไปยังคำสั่งและมันสามารถสำรวจคอลเลกชันทั้งหมดทางอ้อม
ข้างต้นเป็นเพียงคำอธิบายสั้น ๆ ของรูปแบบตัววนซ้ำ มาดูอินเทอร์เฟซตัววนซ้ำใน Java เพื่อดูว่ามันใช้งานได้อย่างไร
1. java.util.iterator
ใน Java Iterator เป็นอินเทอร์เฟซซึ่งให้กฎพื้นฐานซ้ำเท่านั้น ใน JDK มันถูกกำหนดให้เป็นสิ่งนี้: ตัววนซ้ำที่วนซ้ำในคอลเลกชัน ตัววนซ้ำแทนที่การแจงนับในกรอบคอลเลกชัน Java มีความแตกต่างสองประการระหว่างตัววนซ้ำและการแจกแจง:
1. ตัววนซ้ำอนุญาตให้ผู้โทรลบองค์ประกอบออกจากคอลเลคชั่นที่ชี้ไปที่ตัววนซ้ำในระหว่างการทำซ้ำโดยใช้ความหมายที่กำหนดไว้อย่างดี
2. ชื่อวิธีการได้รับการปรับปรุงแล้ว
คำจำกัดความของอินเทอร์เฟซมีดังนี้:
Iterator ส่วนต่อประสานสาธารณะ {Boolean Hasnext (); วัตถุถัดไป (); โมฆะลบ ();} ใน:
Object next (): ส่งคืนการอ้างอิงไปยังองค์ประกอบที่ตัววนซ้ำเพิ่งข้าม ค่าส่งคืนเป็นวัตถุซึ่งจะต้องถูกส่งไปยังประเภทที่คุณต้องการ
บูลีน hasnext (): กำหนดว่ามีองค์ประกอบใด ๆ ที่มีอยู่ในคอนเทนเนอร์เพื่อเข้าถึง
เป็นโมฆะลบ (): ลบองค์ประกอบที่ตัววนซ้ำเพิ่งข้าม
สำหรับเราเราจำเป็นต้องใช้ต่อไป () และ hasnext () เพื่อทำซ้ำ ดังนี้:
สำหรับ (iterator it = c.iterator (); it.hasnext ();) {object o = it.next (); // ทำอะไร} คำอธิบายก่อนหน้านี้คือตัววนซ้ำมีข้อได้เปรียบที่ดีนั่นคือเราไม่จำเป็นต้องรู้ผลลัพธ์ภายในของชุด โครงสร้างภายในและสถานะของชุดได้รับการดูแลโดยตัววนซ้ำ เราตัดสินและรับองค์ประกอบต่อไปผ่านวิธีการรวม Hasnext () และถัดไป () สำหรับการใช้งานภายในที่เฉพาะเจาะจงเราไม่จำเป็นต้องกังวลเกี่ยวกับเรื่องนี้ แต่ในฐานะโปรแกรมเมอร์ที่ผ่านการรับรองมีความจำเป็นอย่างยิ่งที่จะต้องพิจารณาการใช้งานของตัววนซ้ำ ซอร์สโค้ดของ ArrayList ถูกวิเคราะห์ด้านล่าง
2. การใช้งานตัววนซ้ำสำหรับแต่ละคอลเลกชัน
มาวิเคราะห์การใช้งาน erraylist ในความเป็นจริงถ้าเราเข้าใจโครงสร้างข้อมูลของ ArrayList, Hashset และ Treeset และนำไปใช้ภายในเราจะมั่นใจเกี่ยวกับวิธีการใช้ Iterator เนื่องจากการใช้งานภายในของ ArrayList ใช้อาร์เรย์เราจึงต้องบันทึกดัชนีของตำแหน่งที่สอดคล้องกันเท่านั้นและการใช้วิธีการนั้นค่อนข้างง่าย
2.1. การใช้งาน erraylist
ภายใน ArrayList ก่อนกำหนด ITR ชั้นในซึ่งใช้อินเทอร์เฟซตัววนซ้ำดังนี้:
คลาสส่วนตัว ITR ใช้ตัววนซ้ำ <e> {// ทำอะไรสักอย่าง} และวิธีการ iterator () ของ ArrayList ถูกนำมาใช้:
Public Iterator <E> iterator () {return ใหม่ itr ();} ดังนั้นวิธีการของ arraylist.iterator () ส่งคืนคลาสภายใน ITR () ดังนั้นสิ่งที่เราต้องใส่ใจในตอนนี้คือการใช้คลาสภายใน ITR ():
สามตัวแปร int-type ถูกกำหนดภายใน ITR: เคอร์เซอร์, Lastret และที่คาดหวัง ในกรณีที่เคอร์เซอร์แสดงถึงตำแหน่งดัชนีขององค์ประกอบถัดไปและ Lastret แสดงถึงตำแหน่งดัชนีขององค์ประกอบก่อนหน้า
เคอร์เซอร์ int; int lastret = -1; int คาดหวัง modCount = modCount;
จากคำจำกัดความของเคอร์เซอร์และ Lastret จะเห็นได้ว่า Lastret นั้นมีค่าน้อยกว่าเคอร์เซอร์อยู่เสมอดังนั้นวิธีการใช้งานของ Hasnext () นั้นง่ายมาก คุณต้องตัดสินว่าเคอร์เซอร์และ Lastret นั้นเท่าเทียมกันหรือไม่
บูลีนสาธารณะ hasnext () {กลับเคอร์เซอร์! = size;} การใช้งานถัดไป () นั้นค่อนข้างง่าย เพียงส่งคืนองค์ประกอบที่ตำแหน่งดัชนีเคอร์เซอร์แล้วปรับเปลี่ยนเคอร์เซอร์และ Lastret
สาธารณะ e next () {checkforcomodification (); int i = เคอร์เซอร์; // บันทึกตำแหน่งดัชนีถ้า (i> = size) // ถ้าองค์ประกอบที่ได้รับมากกว่าจำนวนองค์ประกอบการรวบรวมข้อยกเว้นจะถูกโยนโยน nosuchelementException ใหม่ (); Object [] elementData = arrayList.his.elementData; if (i> = elementData.length) โยนใหม่พร้อมกันใหม่ Exception (); Cursor = i + 1; // เคอร์เซอร์ + 1Return (e) elementData [lastret = i]; // Lastret + 1 และส่งคืนองค์ประกอบที่เคอร์เซอร์} CheckForComodification () ส่วนใหญ่ใช้เพื่อตรวจสอบว่าจำนวนการดัดแปลงของชุดนั้นถูกกฎหมายหรือไม่นั่นคือเพื่อพิจารณาว่าชุดได้รับการแก้ไขในระหว่างกระบวนการสำรวจหรือไม่ Modcount ใช้เพื่อบันทึกจำนวนการดัดแปลงของคอลเลกชัน ArrayList เริ่มต้นเป็น 0 และเมื่อใดก็ตามที่คอลเลกชันได้รับการแก้ไขหนึ่งครั้ง (การอัปเดตภายในจะไม่นับรวมสำหรับโครงสร้าง) เช่น ADD, ORMED และวิธีอื่น ๆ , ModCount + 1 ดังนั้นหาก ModCount ยังคงไม่เปลี่ยนแปลงหมายความว่าเนื้อหาของคอลเลกชันไม่ได้รับการแก้ไข กลไกนี้ส่วนใหญ่ใช้เพื่อใช้กลไกความล้มเหลวอย่างรวดเร็วของการรวบรวม ArrayList ในคอลเล็กชั่น Java ส่วนใหญ่ของคอลเลกชันมีกลไกความล้มเหลวอย่างรวดเร็ว ฉันจะไม่พูดถึงเรื่องนี้ที่นี่และฉันจะพูดถึงมันในภายหลัง ดังนั้นเพื่อให้แน่ใจว่าไม่มีข้อผิดพลาดในระหว่างกระบวนการสำรวจเราควรตรวจสอบให้แน่ใจว่าจะไม่มีการปรับเปลี่ยนโครงสร้างในการรวบรวมในระหว่างกระบวนการสำรวจ (ยกเว้นวิธีการลบ) หากเกิดข้อผิดพลาดข้อยกเว้นเราควรตรวจสอบอย่างรอบคอบว่าโปรแกรมมีข้อผิดพลาดแทนที่จะไม่ประมวลผลหลังจากจับได้หรือไม่
void checkforcomodification () {if (modcount! = คาดหวัง modcount) โยนใหม่พร้อมกันใหม่ Exception ();} วิธีการลบ () เป็นการใช้งานซึ่งเรียกวิธีการลบ () ของ ArrayList เพื่อลบองค์ประกอบตำแหน่ง LASTRET แล้วแก้ไข ModCount
โมฆะสาธารณะลบ () {ถ้า (lastret <0) โยน unlueLstateException ใหม่ (); checkforcomodification (); ลอง {arraylist.his.remove (lastret); เคอร์เซอร์ = lastret; lastret = -1;ข้างต้นเป็นวิธีการใช้งานของการทำซ้ำ iterator iterator Java Collection ที่แนะนำโดยบรรณาธิการ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!