মনে করুন আমাদের একটি নেস্টেড লিস্ট অফ ইন্টিজার আছে, আমাদের এটিকে ফ্ল্যাটেন করার জন্য একটি ইটেরেটর ইম্প্লিমেন্ট করতে হবে। প্রতিটি এলিমেন্ট হয় একটি ইন্টিজার, অথবা একটি লিস্ট। সেই লিস্টের এলিমেন্টগুলোর মাঝেও আবার ইন্টিজার বা অন্য লিস্ট থাকতে পারে। ইনপুট যদি [[1, 1], 2, [1, 1]] হয়, তবে আউটপুট হবে [1, 1, 2, 1, 1]।
এটি সমাধান করতে আমরা নিচের ধাপগুলো ফলো করব (রিকার্সিভ ফ্ল্যাটেন + ইটেরেটর প্যাটার্ন):
ইনিশিয়ালাইজেশন: নেস্টেড লিস্ট নেবে,
resখালি লিস্ট,index := 0,getVal(nestedList)কল করুন।getVal(NestedList):for item in NestedList:যদি
itemইন্টিজার হয়, তবেres.append(item)।অন্যথায়
getVal(item)কল করুন (রিকার্সিভ)۔
next()মেথডindex-এ পয়েন্ট করা ভ্যালু রিটার্ন করবে এবংindex১ বাড়াবে।hasNext()মেথডtrueরিটার্ন করবে যদি পরবর্তী এলিমেন্ট থাকে, অন্যথায়false।
উদাহরণ (Python)
নিচের ইমপ্লিমেন্টেশন দেখুন ভালো বুঝতে।
class NestedIterator(object):
def __init__(self, nestedList):
self.res = []
self.index = 0
self.getVal(nestedList)
def getVal(self, NestedList):
for item in NestedList:
if isinstance(item, int):
self.res.append(item)
else:
self.getVal(item)
def next(self):
self.index += 1
return self.res[self.index - 1]
def hasNext(self):
if self.index == len(self.res):
return False
return True
ob = NestedIterator([[1,1],2,[1,1]])
while ob.hasNext():
print(ob.next())
ইনপুট
[[1,1],2,[1,1]]
আউটপুট
1 1 2 1 1