জাভাতে PriorityQueue কীভাবে ব্যবহার করবেন
প্রোগ্রামিং-এ প্রায়োরিটি কিউ (priority queue) ব্যবহার করা হয় এমন ডেটা স্ট্রাকচার তৈরির জন্য যেখানে সর্বোচ্চ মান वाले ডেটা আইটেমটি স্ট্রাকচার দ্বারা প্রথমে প্রসেস করা হবে।
জাভাতে কোডিং করার সময় আপনি এমন পরিস্থিতির সম্মুখীন होতে পারেন যেখানে আপনি একটি প্রায়োরিটি কিউ ইমপ্লিমেন্ট করতে চান। সেটাই হলো জাভা Queue ইন্টারফেসের কাজ। যjny Queue একটি ইন্টারফেস, আপনি সরাসরি এটি আপনার কোডে ইমপ্লিমেন্ট করতে পারবেন না। আপনি যদি হিপ (heap) ডেটা স্ট্রাকচারের সাথে একটি প্রায়োরিটি কিউ তৈরি করতে চান, তবে আপনাকে PriorityQueue ব্যবহার করতে হবে।
এই টিউটোরিয়ালে জাভাতে PriorityQueue-এর বেসিকস এবং কীভাবে একটি কিউ তৈরি করতে হয় সেটি আলোচনা করা হবে। এই টিউটোরিয়ালে PriorityQueue-এর প্রধান মেথডগুলোর ওপরও আলোচনা হবে যেগুলো কিউ-এর কন্টেন্ট রিট্রিভ এবং ম্যানিপুলেট করতে ব্যবহৃত হয়।
জাভা Queue এবং PriorityQueue
স্ট্যাকের মতোই কিউ (Queue) ডেটা স্ট্রাকচার যাতে অপারেশনগুলো একটি নির্দিষ্ট ক্রমে করা হয়। কিউর ক্ষেত্রে, অপারেশনগুলো ফার্স্ট-ইন, ফার্স্ট-আউট (FIFO) অর্ডারে করা হয়। এর মানে হলো লিস্টের প্রথম আইটেমটি সবসময় প্রথমে বের হবে — কিউটি এলিমেন্টগুলো ইনসার্ট হওয়ার ক্রম অনুযায়ী সাজানো থাকে।
মান लीজिए আপনি একটি রেস্টুরেন্টে আছেন, এবং আপনি অর্ডার দিয়েছেন। আপনি চাইবেন প্রতিটি কাস্টমার খাবার অর্ডার করার ক্রম অনুযায়ী সার্ভ করা হয়, কারণ সেটিই সবচেয়ে ন্যায্য পদ্ধতি। তাই, যদি আপনি জ্যাকের পর খাবার অর্ডার করেন, তবে আপনি জ্যাকের ঠিক পর সার্ভ হওয়া চাইবেন। সেটিই একটি কিউর উদাহরণ।
এই টিউটোরিয়ালের জন্য, আমরা Queue ইন্টারফেসের PriorityQueue ইমপ্লিমেন্টেশনের ওপর ফোকাস করব, যা জাভাতে প্রায়োরিটি কিউ তৈরি করতে ব্যবহৃত হয়।
PriorityQueue হলো একটি কিউর প্রকার যানোর এলিমেন্টগুলো তাদের প্রায়োরিটি অনুযায়ী সাজানো থাকে। এর মানে, ৫ এবং ১০ মান वाले একটি কিউতে, ১০ সবসময় কিউর শুরুতে থাকবে, এমনকি যদি সেটি শেষে যোগ করা হয়।
একটি প্রায়োরিটি কিউ তৈরি করুন
জাভাতে একটি প্রায়োরিটি কিউ তৈরি করতে, আপনাকে প্রথমে java.util.PriorityQueue প্যাকেজ ইম্পোর্ট করতে হবে। এই প্যাকেজে PriorityQueue মেথড থাকে যা আমরা আমাদের কিউ তৈরি করতে ব্যবহার করতে পারি। PriorityQueue প্যাকেজ ইম্পোর্ট করতে এই কোডটি ব্যবহার করুন:
import java.util.PriorityQueue;
এখন PriorityQueue ইম্পোর্ট করেছি, আমরা প্যাকেজটি ব্যবহার করে একটি কিউ তৈরি করতে পারি। PriorityQueue তৈরি করার সিনট্যাক্স:
PriorityQueue<DataType> queue_name = new PriorityQueue<>();
এটি ভাঙে দেখা যাক:
- PriorityQueue আমাদের প্রোগ্রামকে বলে যে আমরা একটি প্রায়োরিটি কিউ তৈরি করতে চাই।
- DataType হলো আমাদের কিউ কোন ধরনের ডেটা স্টোর করবে।
- queue_name হলো ভেরিয়েবলের নাম যাতে আমরা তৈরি করা কিউটি অ্যাসাইন করব।
- new PriorityQueue(); একটি প্রায়োরিটি কিউ ইনিশিয়ালাইজ করে।
তাহলে, মনে করুন আমরা আমাদের রেস্টুরেন্টে কাস্টমারদের অর্ডার স্টোর করার জন্য একটি কিউ তৈরি করতে চাই। আমরা আমাদের কিউতে প্রতিটি কাস্টমারের টেবিল নম্বর স্টোর করতে চাই। আমরা নিচের কোড ব্যবহার করে এই স্ট্যাকটি তৈরি করতে পারি:
PriorityQueue<Integer> orders = new PriorityQueue<>();
এই উদাহরণে, আমরা orders নামে PriorityQueue-এর একটি ইনস্ট্যান্স তৈরি করেছি যা ইন্টিজার মান স্টোর করে। আমাদের কিউতে, এলিমেন্টগুলো FIFO ডেটা স্ট্রাকচার ব্যবহার করে অ্যাক্সেস এবং রিমুভ করা হবে।
PriorityQueue-এ আইটেম যোগ করুন
জাভাতে, একটি কিউর প্রতিটি এলিমেন্টকে item বলা হয়।
একটি কিউতে আইটেম যোগ করতে, আমরা add() মেথড ব্যবহার করতে পারি। এই মেথড এক প্যারামিটার গ্রহণ করে: যে আইটেমের মান আপনি আপনার কিউতে যোগ করতে চান। যদি কিউ ফুল থাকে, তবে add() মেথড একটি এক্সেপশন রিটার্ন করবে।
অতিরিক্তভাবে, আমরা একটি কিউতে আইটেম যোগ করতে offer() মেথড ব্যবহার করতে পারি। add() এবং offer() এর পার্থক্য হলো offer() কিউ ফুল হলে false রিটার্ন করে, যেখানে add() এক্সেপশন থ্রো করে।
মান লিজিয়ে আমরা টেবিল ২২ এবং ১৭ আমাদের স্ট্যাকে ঐ ক্রমে যোগ করতে চাই কারণ তারা লঞ্চের জন্য অর্ডার দিয়েছে। আমরা এটি এই কোড দিয়ে করতে পারি:
import java.util.PriorityQueue; class AddCustomer { public static void main(String[] args) { PriorityQueue<Integer> orders = new PriorityQueue<>(); orders.add(22); System.println("Orders: " + orders); orders.offer(17); System.out.println("Updated orders: " + orders); } }
আমাদের কোড রিটার্ন করে:
Orders: [22] Updated orders: [22, 17]
আমাদের উদাহরণটি ভাঙে দেখা যাক। প্রথমে, আমরা PriorityQueue ক্লাস ইম্পোর্ট করেছি, যা পরে আমাদের কোডে ব্যবহার করা হয়েছে। তারপর আমরা AddCustomer নামে একটি ক্লাস ডিক্লেয়ার করেছি, যাতে এই উদাহরণের কোড থাকে। এখানে আমাদের ক্লাসের ভিতরের কোড কীভাবে কাজ করে:
- আমরা
new PriorityQueue<>();ব্যবহার করেordersনামে একটি প্রায়োরিটি কিউ তৈরি করি। - আমরা
add()মেথড ব্যবহার করে টেবিল ২২ আমাদের স্ট্যাকে যোগ করি। - আমরা
Orders:শব্দটি এবং আমাদের স্ট্যাকের কন্টেন্ট কনসোলে প্রিন্ট করি। - আমরা
offer()মেথড ব্যবহার করে টেবিল ১৭ আমাদের স্ট্যাকে যোগ করি। - আমরা
Updated orders:শব্দটি এবং আমাদের স্ট্যাকের রিভাইজড কন্টেন্ট কনসোলে প্রিন্ট করি।
২২ আমাদের স্ট্যাকে প্রথমে আসে, তাই যখন আমরা একটি এলিমেন্ট রিমুভ করব তখন সেটি প্রথমে বের হবে। অন্য কথায়, টেবিল ২২ আমাদের স্ট্যাকের টপে আছে। টেবিল ১৭ আমাদের স্ট্যাকে দ্বিতীয় পজিশনে স্টোর করা আছে। মনে রাখবেন, প্রায়োরিটি কিউ FIFO অর্ডারে সাজানো থাকে।
আমাদের কোড আমাদের মূল অর্ডারসহ একটি অ্যারে রিটার্ন করে, তারপর আপডেটেড অর্ডারসহ একটি অ্যারে।
PriorityQueue থেকে আইটেম রিমুভ করুন
PriorityQueue থেকে একটি আইটেম রিমুভ করতে দুটি মেথড ব্যবহার করা যেতে পারে:
remove()একটি কিউ থেকে একটি এলিমেন্টের একক উদাহরণ রিমুভ করে।poll()কিউ থেকে প্রথম এলিমেন্ট রিমুভ করে এবং রিমুভ করা আইটেমটি রিটার্ন করে।
মান লিজিয়ে আমাদের সোশ-শেফ অর্ডার ১৭ প্রসেস করেছে এবং এটি স্ট্যাক থেকে রিমুভ করতে চান। সেই অর্ডার প্রসেস হওয়ার পর, আমাদের শেফ অর্ডার ২২ প্রস্তুত করেছে এবং সেটিও স্ট্যাক থেকে রিমুভ করতে চান।
অর্ডার ১৭ আমাদের স্ট্যাকে পজিশন ২-তে, এবং অর্ডার ২২ পজিশন ১-তে। আমরা এই আইটেমগুলো ঐ ক্রমে রিমুভ করতে চাই। আমরা অর্ডারগুলো রিমুভ করতে এই কোডটি ব্যবহার করতে পারি:
import java.util.PriorityQueue; class RemoveOrders { public static void main(String[] args) { PriorityQueue<Integer> orders = new PriorityQueue<>(); orders.add(22); orders.add(17); boolean removed = orders.remove(2); System.out.println("Was order #17 removed?" + removed); int second_removed = orders.poll(); System.out.println("Order #" + second_removed + " was removed from the queue."); } }
আমাদের কোড রিটার্ন করে:
Was order #17 removed? true Order #22 was removed from the queue.
আমাদের কোড ভাঙে দেখা যাক। প্রথমে, আমরা remove() মেথড ব্যবহার করেছি আমাদের স্ট্যাকে পজিশন ২-তে থাকা অর্ডার রিমুভ করতে। এতে অর্ডার ১৭ রিমুভ হল।
তারপর আমাদের কোড একটি মেসেজ প্রিন্ট করলো, Was order #17 removed? তারপর remove() মেথডের রেজাল্ট। remove() সফলভাবে ১৭ কে আমাদের স্ট্যাক থেকে রিমুভ করলো, তাই মেথডটি true রিটার্ন করল।
পরবর্তীতে, আমরা poll() মেথড ব্যবহার করেছি আমাদের স্ট্যাকের টপ আইটেম রিমুভ করতে। এই কেসে, সেটি ছিল অর্ডার ২২। poll() অর্ডার ২২ রিমুভ করলো এবং রিমুভ করা আইটেমটি রিটার্ন করলো। আইটেম রিমুভ হওয়ার পর, আমরা মেসেজ প্রিন্ট করলাম Order #[order number removed] was removed from the queue. কনসোলে।
আইটেম রিট্রিভ করুন
peek() মেথডটি একটি কিউ আইটেমের হেড (কিউর প্রথম আইটেম) রিট্রিভ করতে ব্যবহৃত হয়। মনে করুন আমরা আমাদের স্ট্যাকের পরবর্তী অর্ডারের মান জানতে চাই কারণ আমাদের সোশ-শেফ একটি নতুন অর্ডার নেওয়ার জন্য প্রস্তুত।
আমরা কাস্টমারের টেবিল নম্বর রিট্রিভ করতে এই কোডটি ব্যবহার করতে পারি যিনি লাইনে পরবর্তী আছেন:
import java.util.PriorityQueue; class RetrieveOrder { public static void main(String[] args) { PriorityQueue<Integer> orders = new PriorityQueue<>(); orders.add(22); orders.add(17); int next_order = orders.peek(); System.out.println("The next order to be processed is table #" + next_order + "."); } }
আমাদের কোড রিটার্ন করে:
The next order to be processed is table #22.
আমাদের স্ট্যাকের প্রথম আইটেম হলো ২২, তাই যখন আমরা peek() মেথড ব্যবহার করি, আমাদের প্রোগ্রাম ২২ মানটি রিটার্ন করে। আমাদের কোডের শেষ লাইনে, আমরা একটি মেসেজ প্রিন্ট করি The next order to be processed is table #[number of first order in stack]., যেখানে স্ট্যাকের প্রথম অর্ডারের নম্বর peek() দ্বারা আবিষ্কৃত হয়েছিল।
একটি প্রায়োরিটি কিউ-এর মধ্য দিয়ে ইটারেট করুন
প্রায়শই, কিউর সাথে কাজ করার সময়, আপনি প্রায়োরিটি কিউর এলিমেন্টগুলো উপর একটি ইটেরেটর তৈরি করতে চাবেন।
এটি করতে, আমরা iterator() মেথড ব্যবহার করতে পারি, যা java.util.Iterator প্যাকেজের অংশ। কিন্তু iterator() মেথড ব্যবহার করার আগে, আমাদের প্রথমে Iterator প্যাকেজ ইম্পোর্ট করতে হবে এই কোড ব্যবহার করে:
import java.util.Iterator;
মান লিজিয়ে আমরা আমাদের রেস্টুরেন্ট অর্ডারসের কিউর প্রতিটি আইটেমের একটি তালিকা কনসোলে প্রিন্ট করতে চাই। আমরা এটি এই কোড দিয়ে করতে পারি:
import java.util.PriorityQueue; import java.util.Iterator; class PrintOrders { public static void main(String[] args) { PriorityQueue<Integer> orders = new PriorityQueue<>(); orders.add(22); orders.add(17); orders.add(14); orders.add(19); Iterator<Integer> iterate = orders.iterator(); while(iterate.hasNext()) { System.out.println(iterate.next()); } } }
আমাদের কোড রিটার্ন করে:
22 17 14 19
আমাদের কোডে, আমরা প্রথমে আমাদের কিউতে চারটি মান যোগ করি। তারপর আমরা iterator() মেথড ব্যবহার করি একটি ইটেরেটর তৈরি করতে যা আমরা আমাদের প্রায়োরিটি কিউর প্রতিটি আইটেমের মধ্য দিয়ে যেতে ব্যবহার করতে পারি। তারপর আমরা একটি while লুপ তৈরি করি যা আমাদের ইটেরেটরের প্রতিটি আইটেমের মধ্য দিয়ে চলে — orders কিউর প্রতিটি আইটেমের জন্য — এবং কিউর পরবর্তী মানটি প্রিন্ট করে।
অতিরিক্ত PriorityQueue মেথড
PriorityQueue ক্লাসের সাথে প্রায়শই তিনটি আরো মেথড ব্যবহৃত হয়। সেগুলো নিচে দেওয়া হলো:
| মেথডের নাম | বিবরণ |
| size() | কিউর দৈর্ঘ্য রিটার্ন করে। |
| toArray() | কিউকে একটি অ্যারেতে রূপান্তর করে। |
| contains(elementName) | কিউতে একটি এলিমেন্ট খোঁজা। |
উপসংহার
PriorityQueue ক্লাস জাভাতে Queue ইন্টারফেস ইমপ্লিমেন্ট করতে ব্যবহৃত হয়। কিউ FIFO ডেটা স্ট্রাকচার ব্যবহার করে, তাই প্রথমে যা ইন হবে সেটি প্রথমে বের হবে।
এই টিউটোরিয়ালে জাভাতে কিউ এবং PriorityQueue-এর বেসিকস নিয়ে আলোচনা করা হয়েছে। আমরা কীভাবে একটি কিউ তৈরি করতে হয় এবং কিউ থেকে আইটেম রিট্রিভ ও ম্যানিপুলেট করার জন্য প্রধান মেথডগুলো নিয়ে আলোচনা করেছি।
এখন আপনার কাছে জাভা PriorityQueue ক্লাস প্রোফেশনালের মত ব্যবহার করার জন্য প্রয়োজনীয় টুলগুলো আছে!