สมมติว่าเราต้องออกแบบคลาส Iterator ซึ่งประกอบด้วยการดำเนินการไม่กี่อย่าง -
- กำหนดคอนสตรัคเตอร์ที่ใช้อักขระสตริงของตัวอักษรภาษาอังกฤษตัวพิมพ์เล็กที่แตกต่างกันและชุดค่าผสมตัวเลขLength เป็นพารามิเตอร์
- กำหนดฟังก์ชัน next() ที่คืนค่าชุดค่าผสมถัดไปของความยาวรวมกันLength ตามลำดับตัวอักษร
- กำหนดฟังก์ชันอื่น hasNext() ที่คืนค่า True หากมีชุดค่าผสมถัดไปอยู่เท่านั้น
ดังนั้นหากอินพุตเป็นแบบ −
CombinationIterator iterator = new CombinationIterator("xyz", 2); iterator.next(); // returns "xy" iterator.hasNext(); // returns true iterator.next(); // returns "xz" iterator.hasNext(); // returns true iterator.next(); // returns "yz" iterator.hasNext(); // returns false
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างหวีอาร์เรย์ของสตริงและดัชนี idx
- กำหนดเมธอด makeCombs() ซึ่งจะรับสตริง s ตัวแปรจำนวนเต็ม l สตริงชั่วคราว ที่ว่างในตอนแรก และเริ่มต้น ซึ่งเท่ากับ 0 เริ่มต้น ซึ่งกำหนดไว้ดังนี้ -
- ถ้าขนาด temp =l ให้ใส่ temp เข้าไปในหวีแล้วคืนกลับ
- สำหรับ i ในช่วงเริ่มต้นที่ขนาดของ s
- makeCombs(s, l, temp + s[i], i + 1)
- printVector() method จะนำอาร์เรย์ของ string เป็นอินพุต ซึ่งจะแสดงองค์ประกอบของอาร์เรย์นั้น
- กำหนดคอนสตรัคเตอร์ดังนี้:สิ่งนี้จะใช้สตริง c และ cl
- เรียก makeCombs(c, cl), set idx :=0
- เมธอด next() จะเพิ่ม idx และส่งคืน comb[idx - 1]
- เมธอด hasNext() จะส่งคืนค่า จริง หาก idx ไม่เหมือนกับขนาดของหวี มิฉะนั้น จะเป็นเท็จ
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อทำความเข้าใจ −
#include <bits/stdc++.h> using namespace std; class CombinationIterator { public: vector <string> combs; int idx; void makeCombs(string s, int l, string temp ="", int start = 0){ if(temp.size() == l){ combs.push_back(temp); return; } for(int i = start; i < s.size(); i++){ makeCombs(s, l, temp + s[i], i + 1); } } void printVector(vector <string> v){ for(int i = 0; i < v.size(); i++){ cout << v[i] << "\n"; } cout << endl; } CombinationIterator(string c, int cl) { makeCombs(c, cl); idx = 0; } string next() { idx++; return combs[idx - 1]; } bool hasNext() { return !(idx == combs.size()); } }; main(){ CombinationIterator ob("xyz", 2); cout << (ob.next()) << endl; cout << (ob.hasNext()) << endl; cout << (ob.next()) << endl; cout << (ob.hasNext()) << endl; cout << (ob.next()) << endl; cout << (ob.hasNext()) << endl; }
อินพุต
Initialize with “xyz” and 2, then call next() and hasNext() multiple times
ผลลัพธ์
xy 1 xz 1 yz 0