গণনা বনাম পুনরাবৃত্তিকারী
এমন অনেক ডেটা স্ট্রাকচার রয়েছে যা জাভাতে সংগ্রহ হিসাবে কাজ করে যেমন ভেক্টর, হ্যাশ টেবিল এবং ক্লাস যা জাভা কালেকশন ফ্রেমওয়ার্ক (যেমন হ্যাশম্যাপ, হ্যাশসেট, অ্যারেলিস্ট, ট্রিসেট, ট্রিম্যাপ, লিঙ্কডলিস্ট, লিঙ্কডহ্যাশম্যাপ এবং লিঙ্কডহ্যাশসেট) প্রয়োগ করে। জাভাতে বস্তুর পৃথক উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করার অনেক উপায় রয়েছে। এই কাজটিকে সহজ করতে জাভা দুটি ইন্টারফেস প্রদান করে। গণনা এবং ইটারেটর হল java.util প্যাকেজে পাওয়া দুটি ইন্টারফেস যা আইটেমগুলির একটি সেট সহ সিকোয়েন্স বা বস্তুর মাধ্যমে গণনা করার কার্যকারিতা প্রদান করে। JDK 1 এ গণনাকারী চালু করা হয়েছিল।0 এবং ইটারেটর যা JDK 1.2 এ চালু করা হয়েছিল কার্যত গণনাকারীর কার্যকারিতা (সংগ্রহ ফ্রেমওয়ার্কের মধ্যে) নকল করে।
গণনা কি?
গণনা হল জাভাতে একটি পাবলিক ইন্টারফেস, JDK 1.0-তে চালু করা হয়েছে, যা উপাদানগুলির ক্রমগুলির মাধ্যমে গণনা করার ক্ষমতা প্রদান করে। এটি java.util প্যাকেজের অধীনে পাওয়া যায়। যখন একটি বস্তু দ্বারা গণনা ইন্টারফেস প্রয়োগ করা হয়, তখন সেই বস্তুটি উপাদানগুলির একটি ক্রম তৈরি করতে পারে। গণনা ইন্টারফেসের দুটি পদ্ধতি রয়েছে। hasMoreElements() পদ্ধতিটি পরীক্ষা করবে যে এই গণনায় আরও উপাদান রয়েছে কিনা এবং nextElement() ক্রমানুসারে পরবর্তী উপাদানটি ফেরত দেয় (যদি কমপক্ষে আরও একটি যেতে হয়)। অন্য কথায়, পর্যায়ক্রমে nextElement() কল করে, প্রোগ্রামার সিরিজের পৃথক উপাদানগুলি অ্যাক্সেস করতে পারে। উদাহরণস্বরূপ, গণনাকারী ব্যবহার করে ভেক্টর v1-এ সমস্ত উপাদান প্রিন্ট করতে, নিম্নলিখিত কোড স্নিপেট ব্যবহার করা যেতে পারে।
গণনা e=v1.elements();
যখন(e.hasMoreLements()){
System.out.println(e.nextElement());
}
সিকোয়েন্সইনপুটস্ট্রিম অবজেক্টে ইনপুটের স্ট্রীম সংজ্ঞায়িত করতেও গণনাকারী ব্যবহার করা যেতে পারে।
Iterator কি?
Iterator হল Java.util প্যাকেজের একটি সর্বজনীন ইন্টারফেস, যা সংগ্রহের অবজেক্টের উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করার অনুমতি দেয় যা সংগ্রহ কাঠামো (যেমন অ্যারেলিস্ট, লিঙ্কডলিস্ট ইত্যাদি) বাস্তবায়ন করে। এটি JDK 1.2 এ প্রবর্তন করা হয়েছিল এবং জাভা কালেকশন ফ্রেমওয়ার্কের মধ্যে গণনাকারীকে প্রতিস্থাপন করা হয়েছিল। ইটারেটরের তিনটি পদ্ধতি রয়েছে। পদ্ধতি hasNext() সংগ্রহে অবশিষ্ট উপাদান আছে কিনা তা পরীক্ষা করে এবং পরবর্তী() পদ্ধতি সিরিজের পরবর্তী উপাদান প্রদান করে। রিমুভ() পদ্ধতিটি অন্তর্নিহিত সংগ্রহ থেকে বর্তমান উপাদান অপসারণ করতে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, ইটারেটর ব্যবহার করে ভেক্টর v1-এ সমস্ত উপাদান প্রিন্ট করতে, নিম্নলিখিত কোড স্নিপেট ব্যবহার করা যেতে পারে।
Iterator i=v1.elements();
যখন(i.hasNext()){
System.out.println(e.next());
}
গণনা এবং পুনরাবৃত্তিকারীর মধ্যে পার্থক্য কী?
যদিও, enumeration এবং Iterator হল java.util প্যাকেজে পাওয়া দুটি ইন্টারফেস, যেটি একটি সিরিজের উপাদানগুলির মাধ্যমে পুনরাবৃত্তি/গণনা করার অনুমতি দেয়, তাদের মধ্যে পার্থক্য রয়েছে। প্রকৃতপক্ষে, ইটারেটর, যা গণনার পরে চালু করা হয়েছিল, জাভা সংগ্রহ কাঠামোর মধ্যে গণনাকে প্রতিস্থাপন করে। গণনার বিপরীতে, ইটারেটর ব্যর্থ-নিরাপদ। এর মানে হল যে যখন Iterator ব্যবহার করা হয় তখন সমসাময়িক পরিবর্তন (অন্তর্নিহিত সংগ্রহে) অনুমোদিত নয়। মাল্টি-থ্রেডেড পরিবেশে এটি খুবই উপযোগী যেখানে সর্বদা সমসাময়িক পরিবর্তনের ঝুঁকি থাকে। একটি সমবর্তী পরিবর্তনের ক্ষেত্রে, Iterator অবজেক্ট একটি ConcurrentModificationException নিক্ষেপ করবে। গণনাকারীর তুলনায় ইটারেটরের ছোট পদ্ধতির নাম রয়েছে। উপরন্তু, পুনরাবৃত্তির সময় উপাদানগুলি মুছে ফেলার অতিরিক্ত কার্যকারিতা রয়েছে (যা গণনাকারী ব্যবহার করে সম্ভব নয়)।সুতরাং, যদি সংগ্রহ থেকে উপাদানগুলি অপসারণ করার প্রয়োজন হয়, তবে ইটারেটরই একমাত্র বিকল্প যা বিবেচনা করা যেতে পারে৷