CodeGym /Java Blog /এলোমেলো /জাভা কিউ ইন্টারফেস এবং এর বাস্তবায়ন
John Squirrels
লেভেল 41
San Francisco

জাভা কিউ ইন্টারফেস এবং এর বাস্তবায়ন

এলোমেলো দলে প্রকাশিত
এখানে আমরা জাভা কিউ ইন্টারফেস নিয়ে আলোচনা করতে যাচ্ছি। আপনি জানতে পারবেন সারি ডেটা স্ট্রাকচার কী, এটি জাভাতে কীভাবে উপস্থাপন করা হয়, সমস্ত সারিগুলির জন্য কোন পদ্ধতিগুলি সবচেয়ে গুরুত্বপূর্ণ। এছাড়াও, জাভা ভাষায় সারির কী বাস্তবায়ন রয়েছে। এর পরে, আমরা সবচেয়ে গুরুত্বপূর্ণ বাস্তবায়নগুলি ঘনিষ্ঠভাবে দেখি এবং উদাহরণ সহ সেগুলি শিখি।

সারি ডেটা কাঠামো

একটি সারি হল একটি রৈখিক বিমূর্ত ডেটা স্ট্রাকচার যার কার্য সম্পাদনের নির্দিষ্ট ক্রম রয়েছে — ফার্স্ট ইন ফার্স্ট আউট (FIFO)। তার মানে আপনি শুধুমাত্র কাঠামোর শেষে একটি উপাদান (বা সারিবদ্ধ, সারিতে রাখুন) যোগ করতে পারেন এবং শুধুমাত্র তার শুরু থেকে একটি উপাদান নিতে পারেন (সারি থেকে সরান)। আপনি খুব সহজে সারি ডেটা কাঠামো কল্পনা করতে পারেন। এটি একটি সারি বা বাস্তব জীবনে গ্রাহকদের একটি লাইন মত মনে হয়. যে গ্রাহক আগে এসেছেন, তাকেও আগে পরিবেশন করা হবে। আপনার যদি ম্যাকডোনাল্ডস বা অন্য কোথাও লাইনে চারজন লোক থাকে, তবে লাইনে দাঁড়ানো প্রথম ব্যক্তিই দোকান পাবে। যদি নতুন গ্রাহক আসে, সে হ্যামবার্গার পাওয়ার জন্য 5তম লাইনে থাকবে। জাভা কিউ ইন্টারফেস এবং এর বাস্তবায়ন - 1সুতরাং, একটি সারি নিয়ে কাজ করার সময়, নতুন উপাদানগুলি শেষ পর্যন্ত যুক্ত করা হয় এবং আপনি যদি একটি উপাদান পেতে চান তবে এটি শুরু থেকে নেওয়া হবে। এটি ক্লাসিক্যাল কিউ ডেটা স্ট্রাকচারের কাজের মূল নীতি।

জাভাতে সারি

জাভাতে সারি হল একটি ইন্টারফেস। ওরাকল ডকুমেন্টেশন অনুসারে, কিউ ইন্টারফেসে 2টি সুপার ইন্টারফেস, 4টি ভিন্ন ইন্টারফেস যা সারি থেকে উত্তরাধিকারসূত্রে পাওয়া যায় এবং ক্লাসগুলির একটি অত্যন্ত চিত্তাকর্ষক তালিকা।

সুপার ইন্টারফেস:

সংগ্রহ<E>, পুনরাবৃত্তিযোগ্য<E>

সমস্ত পরিচিত সাবইন্টারফেস:

BlockingDeque<E>, BlockingQueue<E>, Deque<E>, TransferQueue<E>

সমস্ত পরিচিত বাস্তবায়নকারী ক্লাস:

অ্যাবস্ট্রাক্ট সারি, অ্যারেব্লকিং সারি, অ্যারেডিক, সমবর্তী লিঙ্কডক, সমবর্তী লিঙ্কডকিউ, বিলম্বসারি, লিঙ্কডব্লকিংডিক, লিঙ্কডব্লকিংসারি, লিঙ্কডলিস্ট, লিঙ্কড ট্রান্সফারসারি, অগ্রাধিকার ব্লকিং সারি, অগ্রাধিকার কিউইউ

এর মানে কী? প্রথমত, জাভা কিউ হল কালেকশন ফ্রেমওয়ার্কের একটি অংশ এবং কালেকশন ইন্টারফেস প্রয়োগ করে। সুতরাং এটি সংগ্রহের ইন্টারফেসের সমস্ত পদ্ধতি যেমন সন্নিবেশ, মুছে ফেলা ইত্যাদি সমর্থন করে। সারিটি পুনরাবৃত্তিযোগ্য ইন্টারফেস প্রয়োগ করে, যা একটি বস্তুকে "প্রতিটি লুপের জন্য" বিবৃতির লক্ষ্য হতে দেয়।

সারি পদ্ধতি জাভা

সারি বেশ কয়েকটি পদ্ধতি ঘোষণা করে। ইন্টারফেসের পদ্ধতি হিসাবে তাদের সমস্ত ক্লাসে প্রতিনিধিত্ব করা উচিত যা সারি বাস্তবায়ন করে। সবচেয়ে গুরুত্বপূর্ণ সারি পদ্ধতি, জাভা:
  • বুলিয়ান অফার() - সম্ভব হলে সারিতে একটি নতুন উপাদান সন্নিবেশ করায়
  • বুলিয়ান অ্যাড(ই ই) – সম্ভব হলে সারিতে একটি নতুন উপাদান সন্নিবেশ করায়। সাফল্যের ক্ষেত্রে সত্য প্রত্যাবর্তন করে এবং কোনো স্থান না থাকলে একটি IllegalStateException নিক্ষেপ করে।
  • অবজেক্ট পোল() - এর মাথা থেকে একটি উপাদান পুনরুদ্ধার করে এবং সরিয়ে দেয়। সারি খালি থাকলে শূন্য দেয়।
  • অবজেক্ট রিমুভ () - সারির মাথা থেকে একটি উপাদান পুনরুদ্ধার করে এবং সরিয়ে দেয়।
  • অবজেক্ট পিক() – পুনরুদ্ধার করে, কিন্তু সারির মাথা থেকে একটি উপাদান সরিয়ে দেয় না। সারি খালি থাকলে শূন্য দেয়।
  • অবজেক্ট এলিমেন্ট() – পুনরুদ্ধার করে, কিন্তু সারির মাথা থেকে একটি উপাদান সরিয়ে দেয় না।

জাভা সারির সাব-ইন্টারফেস

সারি ইন্টারফেস 4টি সাব-ইন্টারফেস দ্বারা উত্তরাধিকারসূত্রে পাওয়া যায় – ব্লকিংডিক<E>, ব্লকিং কিউ<E>, ডেক<E>, ট্রান্সফার কিউ<E> । আপনি তাদের 3টি গ্রুপে বিভক্ত করতে পারেন: Deques, Blocking Quues এবং BlockingDeque এর সাথে স্থানান্তর সারিগুলি প্রথমে দুটির অন্তর্গত। আসুন এই দলগুলো এক ঝলক দেখে নেওয়া যাক।

Deques

Deque মানে D ouble- E nded Q ueue এবং ডেটার যেকোনও লেজ থেকে সারি হিসাবে (first-in-first-out/FIFO) বা মাথা থেকে স্ট্যাক (লাস্ট-ইন-) নামে আরেকটি জনপ্রিয় ডেটা স্ট্রাকচার হিসাবে যোগ বা অপসারণ সমর্থন করে। ফার্স্ট-আউট/LIFO)। Deque ইন্টারফেস বাস্তবায়নকারী ক্লাস: ArrayDeque, ConcurrentLinkedDeque, LinkedBlockingDeque, LinkedList।

সারি ব্লক করা

একটি ব্লকিং সারি হল একটি সারি যা দুটি ক্ষেত্রে একটি থ্রেড ব্লক করে:
  • থ্রেড একটি খালি সারি থেকে উপাদান পেতে চেষ্টা করছে
  • থ্রেড সম্পূর্ণ সারিতে উপাদান রাখার চেষ্টা করছে
যখন একটি থ্রেড একটি খালি সারি থেকে আইটেমগুলি পেতে চেষ্টা করে, তখন এটি অপেক্ষা করে যতক্ষণ না অন্য কিছু থ্রেড আইটেমগুলিকে সারিতে রাখে। একইভাবে, যখন একটি থ্রেড উপাদানগুলিকে একটি পূর্ণ সারিতে রাখার চেষ্টা করে, তখন এটি অপেক্ষা করে যতক্ষণ না অন্য কিছু থ্রেড উপাদানগুলিকে উপাদানগুলির জন্য খালি স্থান পেতে সারির বাইরে নিয়ে যায়। অবশ্যই, "পূর্ণ সারি" ধারণাটি বোঝায় যে সারিটির একটি সীমিত আকার রয়েছে, যা সাধারণত কনস্ট্রাক্টরে নির্দিষ্ট করা হয়। স্ট্যান্ডার্ড ব্লকিং সারিগুলির মধ্যে রয়েছে LinkedBlockingQueue, SynchronousQueue, এবং ArrayBlockingQueue। BlockingQueue ইন্টারফেসের ক্লাস বাস্তবায়ন করা : ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedTransferQueue, PriorityBlockingQueue, SynchronousQueue. ব্লকিংডিকBlockingQueue-এর জন্য একটি সাব-ইন্টারফেস। BlockingDeque যেমন BlockingQueue একটি ব্লকিং সারি, কিন্তু দ্বিমুখী। তাই এটি Deque ইন্টারফেসের বৈশিষ্ট্য উত্তরাধিকারসূত্রে পায়। এটি মাল্টি-থ্রেডেড এক্সিকিউশনের জন্য ভিত্তিক, শূন্য উপাদানের অনুমতি দেয় না এবং ক্ষমতা সীমিত হতে পারে। BlockingDeque ইন্টারফেসের প্রয়োগগুলি সারি খালি থাকলে উপাদানগুলি পাওয়ার ক্রিয়াকলাপকে ব্লক করে এবং যদি এটি পূর্ণ থাকে তবে সারিতে একটি উপাদান যোগ করা।

স্থানান্তর সারি

TransferQueue ইন্টারফেস BlockingQueue ইন্টারফেস প্রসারিত করে। তবে BlockingQueue ইন্টারফেস সারি বাস্তবায়নের বিপরীতে, যেখানে থ্রেডগুলিকে ব্লক করা যেতে পারে যদি সারিটি খালি থাকে (পড়া হয়), অথবা যদি সারিটি পূর্ণ থাকে (লেখা হয়), তবে অন্য স্ট্রীম উপাদানটি পুনরুদ্ধার না করা পর্যন্ত ট্রান্সফারকিউ ইন্টারফেস সারিগুলি লেখার স্ট্রিমটিকে ব্লক করে। এই জন্য একটি স্থানান্তর পদ্ধতি ব্যবহার করুন. অন্য কথায়, BlockingQueue এর বাস্তবায়ন গ্যারান্টি দেয় যে প্রযোজকের দ্বারা তৈরি উপাদানটি অবশ্যই সারিতে থাকতে হবে, যখন TransferQueue বাস্তবায়ন গ্যারান্টি দেয় যে প্রযোজক উপাদানটি ভোক্তা দ্বারা "প্রাপ্ত" হবে। TransferQueue ইন্টারফেসের শুধুমাত্র একটি অফিসিয়াল জাভা বাস্তবায়ন আছে - LinkedTransferQueue।

জাভা সারি বাস্তবায়ন

অনেক ক্লাস আছে যা সারি ইন্টারফেস বাস্তবায়ন করে:
  • AbstractQueue Queue Java 8 ডক্স অনুযায়ী, এই বিমূর্ত শ্রেণী কিছু সারি অপারেশনের মৌলিক বাস্তবায়ন প্রদান করে। এটা নাল উপাদানের অনুমতি দেয় না. কিউ ক্লাসিক্যাল অফার , পোল এবং পিক এর উপর ভিত্তি করে যথাক্রমে আরও 3টি পদ্ধতি যোগ, অপসারণ এবং উপাদান রয়েছে । তবে তারা মিথ্যা বা শূন্য রিটার্নের মাধ্যমে ব্যর্থতা নির্দেশ করার পরিবর্তে ব্যতিক্রমগুলি নিক্ষেপ করে।
  • ArrayBlockingQueue — একটি নির্দিষ্ট আকারের FIFO ব্লকিং সারি একটি অ্যারে দ্বারা সমর্থিত
  • ArrayDeque — Deque ইন্টারফেসের আকার পরিবর্তনযোগ্য অ্যারে বাস্তবায়ন
  • ConcurrentLinkedDeque — সংযুক্ত নোডের উপর ভিত্তি করে একটি সীমাহীন সমবর্তী ডেক।
  • ConcurrentLinkedQueue — লিঙ্ক করা নোডের উপর ভিত্তি করে একটি সীমাহীন থ্রেড-নিরাপদ সারি।
  • DelayQueue — একটি স্তূপ দ্বারা সমর্থিত একটি সময়-ভিত্তিক সময়সূচী সারি৷
  • LinkedBlockingDeque — Deque ইন্টারফেসের একযোগে বাস্তবায়ন।
  • LinkedBlockingQueue — একটি ঐচ্ছিকভাবে আবদ্ধ FIFO ব্লকিং সারি লিঙ্ক করা নোড দ্বারা সমর্থিত
  • LinkedList — তালিকা এবং Deque ইন্টারফেসের দ্বিগুণ-সংযুক্ত তালিকা বাস্তবায়ন। সমস্ত ঐচ্ছিক তালিকা ক্রিয়াকলাপ প্রয়োগ করে এবং সমস্ত উপাদানকে অনুমতি দেয় (নাল সহ)
  • LinkedTransferQueue — লিঙ্কড নোডের উপর ভিত্তি করে একটি সীমাহীন স্থানান্তর সারি
  • PriorityBlockingQueue — একটি সীমাহীন ব্লকিং অগ্রাধিকার সারি একটি গাদা দ্বারা সমর্থিত
  • PriorityQueue — হিপ ডেটা স্ট্রাকচারের উপর ভিত্তি করে একটি অগ্রাধিকার সারি
  • SynchronousQueue — একটি ব্লকিং সারি যেখানে প্রতিটি সন্নিবেশ অপারেশন অন্য থ্রেড দ্বারা একটি সংশ্লিষ্ট অপসারণের অপারেশনের জন্য অপেক্ষা করতে হবে এবং এর বিপরীতে।
সবচেয়ে জনপ্রিয় বাস্তবায়ন হল LinkedList, ArrayBlockingQueue এবং PriorityQueue। আসুন তাদের তাকান এবং আরও ভাল বোঝার জন্য কিছু উদাহরণ করি।

যোজিত তালিকা

জাভাতে ক্লাস লিঙ্কডলিস্ট তালিকা এবং ডেক ইন্টারফেস প্রয়োগ করে। সুতরাং, এটি তালিকা এবং ডেকের সংমিশ্রণ, একটি দ্বি-মুখী সারি, যা উভয় দিক থেকে উপাদান যোগ এবং অপসারণ সমর্থন করে। জাভা লিঙ্কডলিস্টে দ্বিগুণ-লিঙ্কযুক্ত তালিকা: তালিকার প্রতিটি উপাদান নোডকে কল করে এবং এতে একটি অবজেক্ট রয়েছে এবং দুটি প্রতিবেশী বস্তুর উল্লেখ রয়েছে - আগের এবং পরেরটি। জাভা কিউ ইন্টারফেস এবং এর বাস্তবায়ন - 2আপনি বলতে পারেন যে লিঙ্কডলিস্ট মেমরি ব্যবহারের ক্ষেত্রে খুব কার্যকর নয়। এটা সত্য, কিন্তু এই ডেটা স্ট্রাকচারটি অপারেশন পারফরম্যান্সের সন্নিবেশ এবং মুছে ফেলার ক্ষেত্রে কার্যকর হতে পারে। তবে এটি তখনই ঘটে যখন আপনি তাদের জন্য পুনরাবৃত্তিকারী ব্যবহার করেন (এই ক্ষেত্রে এটি ধ্রুবক সময়ে ঘটে)। সূচী দ্বারা অ্যাক্সেস অপারেশনগুলি পছন্দসই উপাদানের শেষের শুরু থেকে (যেটি কাছাকাছি) অনুসন্ধান করে সঞ্চালিত হয়। যাইহোক, উপাদানগুলির মধ্যে রেফারেন্স সংরক্ষণের জন্য অতিরিক্ত খরচ সম্পর্কে ভুলবেন না। সুতরাং, লিঙ্কডলিস্ট হল জাভাতে সবচেয়ে জনপ্রিয় সারি বাস্তবায়ন। এটি List এবং Deque এর একটি বাস্তবায়ন এবং এটি আমাদেরকে null সহ যেকোনো বস্তুর সমন্বয়ে একটি দ্বিমুখী সারি তৈরি করতে দেয়। LinkedList হল উপাদানের একটি সংগ্রহ।
লিঙ্কডলিস্ট সম্পর্কে আরও: লিঙ্কডলিস্ট জাভা ডেটা স্ট্রাকচার

LinkedList Constructors

লিঙ্কডলিস্ট() প্যারামিটার ছাড়াই একটি খালি তালিকা তৈরি করতে ব্যবহৃত হয়। LinkedList(সংগ্রহ<? extensions E> c) হল নির্দিষ্ট সংগ্রহের উপাদান সমন্বিত একটি তালিকা তৈরি করার জন্য, ক্রমানুসারে, সেগুলি সংগ্রহের পুনরাবৃত্তিকারী দ্বারা ফেরত দেওয়া হয়।

প্রধান লিঙ্কডলিস্ট পদ্ধতি:

  • add(E element) এই তালিকার শেষে নির্দিষ্ট উপাদান যুক্ত করে;
  • add(int index, E element) নির্দিষ্ট অবস্থানের সূচকে এলিমেন্ট সন্নিবেশ করায়;
  • get(int index) এই তালিকার নির্দিষ্ট অবস্থানে উপাদান প্রদান করে;
  • remove(int index) অবস্থান সূচকে থাকা উপাদানটিকে সরিয়ে দেয়;
  • Remove(Object o) এই তালিকা থেকে ?o উপাদানের প্রথম উপস্থিতি সরিয়ে দেয় যদি এটি সেখানে থাকে।
  • remove() পুনরুদ্ধার করে এবং তালিকার প্রথম উপাদানটি সরিয়ে দেয়।
  • addFirst(), addLast() একটি তালিকার শুরু/শেষে একটি উপাদান যোগ করুন
  • clear() তালিকা থেকে সমস্ত উপাদান সরিয়ে দেয়
  • contains(Object o) ট্রু রিটার্ন করে যদি তালিকায় o উপাদান থাকে।
  • indexOf(Object o) o উপাদানটির প্রথম উপস্থিতির সূচী প্রদান করে, অথবা -1 যদি তালিকায় না থাকে।
  • set(int index, E element) সূচী অবস্থানে থাকা এলিমেন্টকে এলিমেন্ট দিয়ে প্রতিস্থাপন করে
  • size() তালিকায় উপাদানের পরিমাণ প্রদান করে।
  • toArray() প্রথম থেকে শেষ উপাদান পর্যন্ত তালিকার সমস্ত উপাদান ধারণকারী একটি অ্যারে প্রদান করে।
  • pop() যা স্ট্যাক থেকে একটি উপাদান পপ করে (তালিকা দ্বারা উপস্থাপিত)
  • পুশ(ই ই) যা একটি উপাদানকে স্ট্যাকের উপর ঠেলে দেয় (এই তালিকা দ্বারা উপস্থাপিত)
জাভা সারির উদাহরণ — লিঙ্কডলিস্ট (বিভিন্ন উপায়ে উপাদান রাখা এবং অপসারণ করা)

import java.util.*;
 
public class LinkedListTest {
 
       public static void main(String args[]){
 
           LinkedList<Integer> myLinkedList= new LinkedList<Integer>();
           myLinkedList.add(1);
           myLinkedList.add(2);
           myLinkedList.add(4);
           System.out.println("three added elements: " + myLinkedList);
           //put one element into the head, not to the tail:
           myLinkedList.push(5);
           System.out.println("The new element last in will be the first: " + myLinkedList);
           //add new element at the specified position:
           myLinkedList.add(4,3);
           //put one element into the head, not to the tail (same as push):
           myLinkedList.addFirst(6);
           System.out.println(myLinkedList);
           //now remove element no 2 (it is 1):
           myLinkedList.remove(2);
           System.out.println(myLinkedList);
           //now remove the head of the list
           myLinkedList.pop();
           System.out.println(myLinkedList);
           //remove with the other method
           myLinkedList.remove();
           System.out.println(myLinkedList);
           //and with one more
           myLinkedList.poll();
           System.out.println(myLinkedList);
       }
       }

অগ্রাধিকার সারি

FIFO সাধারণ অর্থে PriorityQueue ঠিক সারি নয়। অগ্রাধিকার সারির উপাদানগুলি তাদের স্বাভাবিক ক্রম অনুসারে বা সারি নির্মাণের সময় সরবরাহকারী তুলনাকারীর দ্বারা অর্ডার করা হয়, কোন কনস্ট্রাক্টর ব্যবহার করা হয় তার উপর নির্ভর করে। তবে এটি এমন একটি অর্ডার নয় যেমন এটি রৈখিক কাঠামোতে হতে পারে যেমন তালিকা (সবচেয়ে বড় থেকে ছোট বা তদ্বিপরীত)। একটি অগ্রাধিকার সারি একটি অগ্রাধিকার মিন হিপের উপর ভিত্তি করে৷ হিপ হল বাইনারি ট্রি ভিত্তিক একটি ডাটা স্ট্রাকচার. প্রতিটি পিতামাতার অগ্রাধিকার তার সন্তানদের অগ্রাধিকারের চেয়ে বেশি। একটি গাছকে সম্পূর্ণ বাইনারি বলা হয় যদি প্রতিটি পিতা-মাতার দুইটির বেশি সন্তান না থাকে এবং স্তরগুলির ভরাট উপরে থেকে নীচে যায় (একই স্তর থেকে - বাম থেকে ডানে)। বাইনারি হিপ প্রতিবার এটি থেকে একটি নতুন উপাদান যোগ করা বা সরানো হলে নিজেকে পুনর্গঠিত করে। মিন-হিপের ক্ষেত্রে, ক্ষুদ্রতম উপাদানটি তার সন্নিবেশের ক্রম নির্বিশেষে মূলে যায়। এই মিন-হিপের উপর ভিত্তি করে অগ্রাধিকার সারি, তাই যদি আমাদের কাছে পূর্ণসংখ্যার একটি অগ্রাধিকার সারি থাকে, তাহলে এর প্রথম উপাদানটি এই সংখ্যাগুলির মধ্যে সবচেয়ে ছোট হবে। আপনি রুট মুছে ফেললে, পরবর্তী ক্ষুদ্রতম একটি রুট হয়ে যায়।

প্রধান অগ্রাধিকার সারি পদ্ধতি:

  • বুলিয়ান অ্যাড(অবজেক্ট) অগ্রাধিকার সারিতে নির্দিষ্ট উপাদান সন্নিবেশ করায়। সাফল্যের ক্ষেত্রে সত্য ফিরে আসে। সারি পূর্ণ হলে, পদ্ধতি একটি ব্যতিক্রম নিক্ষেপ করে।
  • বুলিয়ান অফার(অবজেক্ট) এই অগ্রাধিকার সারিতে নির্দিষ্ট উপাদান সন্নিবেশ করায়। সারি পূর্ণ হলে, পদ্ধতি মিথ্যা প্রদান করে।
  • বুলিয়ান রিমুভ(অবজেক্ট) এই সারি থেকে নির্দিষ্ট উপাদানের একটি একক উদাহরণ সরিয়ে দেয়, যদি এটি উপস্থিত থাকে।
  • অবজেক্ট পোল() এই সারির মাথাটি পুনরুদ্ধার করে এবং সরিয়ে দেয়। সারি খালি থাকলে শূন্য দেয়।
  • void clear() অগ্রাধিকার সারি থেকে সমস্ত উপাদান সরিয়ে দেয়।
  • অবজেক্ট উপাদান() এটি অপসারণ না করে এই সারির মাথাটি পুনরুদ্ধার করে। সারি খালি থাকলে NoSuchElementException নিক্ষেপ করে।
  • অবজেক্ট পিক() সারির মাথাটি অপসারণ না করেই পুনরুদ্ধার করে। সারি খালি থাকলে শূন্য দেয়।
  • বুলিয়ান ধারণ করে (অবজেক্ট o) সারিতে o উপাদান থাকলে সত্য ফেরত দেয়।
  • int size() এই সারিতে থাকা উপাদানের সংখ্যা প্রদান করে।

অগ্রাধিকার সারির উদাহরণ


import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
 
public class PriorityQueueExample {
   public static void main(String[] args) {
 
       Queue<Integer> queueL = new LinkedList<>();
       for (int i = 5; i > 0; i--) {
           queueL.add(i);
       }
       System.out.println("Print our LinkedList Queue (FIFO): " + queueL);
       Queue<Integer> priorityQueue = new PriorityQueue<>();
 
       for (int i = 5; i > 0; i--) {
       priorityQueue.offer(i);
       }
 
       System.out.println("PriorityQueue printing (by iterating, no elements removing): " + priorityQueue);
       System.out.println("Print PriorityQueue using poll() (by retrieval): " );
       while (!priorityQueue.isEmpty()) {
           System.out.println(priorityQueue.poll());
       }
}
}
Print our LinkedList Queue (FIFO): [5, 4, 3, 2, 1]
PriorityQueue printing (by iterating, no elements removing): [1, 2, 4, 5, 3]
Print our  PriorityQueue using poll() (by retrieval): 
1
2
3
4
5
এটা বোঝা গুরুত্বপূর্ণ যে অগ্রাধিকার সারিগুলি বাইনারি হিপের উপর ভিত্তি করে, তাই তারা উপাদানগুলিকে রৈখিক সাজানো ক্রমে রাখে না। মূল থেকে পাতা পর্যন্ত প্রতিটি উপায় আদেশ করা হয়, কিন্তু মূল থেকে বিভিন্ন উপায় না. তার মানে আপনি খুব দ্রুত সারির ন্যূনতম উপাদান পেতে পারেন। আপনি যদি প্রতিবার মাথা মুছে দেন, আপনি একটি সাজানো কাঠামো মুদ্রণ করবেন।

ArrayBlockingQueue

ArrayBlockingQueue- এর অভ্যন্তরীণ ডেটা স্ট্রাকচারউপাদান সংরক্ষণ করার জন্য একটি বৃত্তাকার অ্যারের উপর ভিত্তি করে। এটি একটি সাধারণ সারি (FIFO) যদি সারির লেজে নতুন উপাদান ঢোকানো হয়, এবং নিষ্কাশন ক্রিয়াকলাপগুলি সারির মাথা থেকে একটি উপাদান ফিরিয়ে দেয়। একবার তৈরি হয়ে গেলে সারির ক্ষমতা পরিবর্তন করা যায় না। একটি সম্পূর্ণ সারিতে একটি উপাদান ঢোকানোর (বঠানো) প্রচেষ্টা প্রবাহকে বাধা দেয়; একটি খালি সারি থেকে একটি উপাদান নেওয়ার চেষ্টা করা থ্রেডটিকে ব্লক করে। আমরা আগেই বলেছি, এই অ্যারেটি বৃত্তাকার। এর মানে হল যে অ্যারের প্রথম এবং শেষ উপাদানগুলিকে যৌক্তিকভাবে সংলগ্ন হিসাবে বিবেচনা করা হয়। আপনি যখনই এলিমেন্টোটিকে সারিতে রাখেন বা সারিতে থেকে সরিয়ে দেন তখন সারিতে মাথা এবং লেজের উপাদানগুলির সূচকগুলি অগ্রসর হয়৷ যদি কিছু সূচক অ্যারের শেষ উপাদানটিকে অগ্রসর করে তবে এটি 0 থেকে পুনরায় চালু হয়। তাই, মাথা অপসারণের ক্ষেত্রে সারিতে সমস্ত উপাদান স্থানান্তর করতে হবে না (স্বাভাবিক অ্যারের মতো)। যাইহোক, মাঝখান থেকে একটি উপাদান সরানোর ক্ষেত্রে (Iterator.remove ব্যবহার করে), উপাদানগুলি স্থানান্তরিত হয়। ArrayBlockingQueue প্রযোজক (উপাদান সন্নিবেশ করান) এবং ভোক্তাদের (উপাদান নিষ্কাশন) অপেক্ষা প্রবাহের কাজ অর্ডার করতে কনস্ট্রাক্টরে ন্যায্য প্যারামিটার সহ একটি অতিরিক্ত ন্যায্যতা নীতি সমর্থন করে । ডিফল্টরূপে, অর্ডার নিশ্চিত করা হয় না. তবে যদি সারিটি "fair == true" দিয়ে তৈরি করা হয়, তাহলে ArrayBlockingQueue ক্লাসের বাস্তবায়ন ফিফো ক্রমানুসারে থ্রেড অ্যাক্সেস প্রদান করে। ইক্যুইটি সাধারণত ব্যান্ডউইথ কমায়, কিন্তু অস্থিরতাও কমায় এবং সম্পদের ফুরিয়ে যাওয়া রোধ করে।

ArrayBlockingQueue ক্লাস কনস্ট্রাক্টর

  • ArrayBlockingQueue (int ক্ষমতা) নির্দিষ্ট ক্ষমতার একটি সারি তৈরি করে এবং একটি ডিফল্ট অ্যাক্সেস নীতি সহ।
  • ArrayBlockingQueue (int ক্ষমতা, বুলিয়ান ফেয়ার) একটি নির্দিষ্ট ক্ষমতা এবং একটি নির্দিষ্ট অ্যাক্সেস নীতি সহ একটি সারি তৈরি করে।
  • ArrayBlockingQueue (int ক্ষমতা, বুলিয়ান ফেয়ার, সংগ্রহ <? প্রসারিত E> c) অ্যাক্সেস নীতি দ্বারা নির্দিষ্ট একটি নির্দিষ্ট ক্ষমতা সহ একটি সারি তৈরি করে এবং সারিতে উপাদানগুলি অন্তর্ভুক্ত করে।
এখানে আমরা BlockingQueueExample উদাহরণ পেয়েছি। আমরা একটি উপাদানের ক্ষমতা এবং একটি ন্যায্য পতাকা সহ ArrayBlockingQueue-এর একটি সারি তৈরি করি। দুটি থ্রেড শুরু হয়। তাদের মধ্যে প্রথমটি, প্রযোজক থ্রেড, পুট পদ্ধতি ব্যবহার করে বার্তা অ্যারে থেকে বার্তাগুলি সারিবদ্ধ করে। দ্বিতীয়টি, উপভোক্তা, থ্রেড টেক মেথড ব্যবহার করে সারি থেকে উপাদানগুলি পড়ে এবং সেগুলিকে কনসোলে প্রদর্শন করে। উপাদানের ক্রম সারির জন্য স্বাভাবিক।

import java.util.concurrent.*;
 
public class ArrayBlockingQueueExample {
 
   private BlockingQueue<Integer> blockingQueue;
   private final Integer[]  myArray = {1,2,3,4,5};
  
       public ArrayBlockingQueueExample ()
       { blockingQueue = new ArrayBlockingQueue<Integer>(1, true);
           (new Thread(new Producer())).start();
           (new Thread(new Consumer())).start();
       }
 
       class Producer implements Runnable
       {
           public void run() {
               try {
                   int counter = 0;
                   for (int i=0; i < myArray.length; i++) {
                       blockingQueue.put(myArray[i]);
                       if (counter++ < 2)
                           Thread.sleep(3000);
                   } blockingQueue.put(-1);
               }
               catch (InterruptedException e) {
                   System.err.println(e.getMessage());
               }
           }
       }
 
       class Consumer implements Runnable
       {
           public void run() {
               try {
                   Integer message = 0;
                   while (!((message = blockingQueue.take()).equals(-1)))
                       System.out.println(message);
               } catch (InterruptedException e) {
                   System.err.println(e.getMessage());
               }
           }
       }
 
       public static void main(String[] args) {
           new ArrayBlockingQueueExample();
       }
   }
আউটপুট হল প্রাকৃতিক ক্রমে সারি; প্রথম দুটি উপাদান বিলম্বের সাথে উপস্থিত হয়। আপনি যা শিখেছেন তা শক্তিশালী করার জন্য, আমরা আপনাকে আমাদের জাভা কোর্স থেকে একটি ভিডিও পাঠ দেখার পরামর্শ দিই

উপসংহার

  • সারিটি সারির শেষে উপাদান সন্নিবেশ করতে ব্যবহৃত হয় এবং সারির শুরু থেকে সরানো হয়। এটি ফিফো ধারণা অনুসরণ করে।
  • জাভা কিউ হল কালেকশন ফ্রেমওয়ার্কের একটি অংশ এবং কালেকশন ইন্টারফেস প্রয়োগ করে। সুতরাং এটি সংগ্রহের ইন্টারফেসের সমস্ত পদ্ধতি যেমন সন্নিবেশ, মুছে ফেলা ইত্যাদি সমর্থন করে।
  • সারির সবচেয়ে বেশি ব্যবহৃত বাস্তবায়ন হল LinkedList, ArrayBlockingQueue এবং PriorityQueue।
  • অগ্রাধিকার সারির উপাদানগুলি তাদের স্বাভাবিক ক্রম অনুসারে বা সারি নির্মাণের সময় সরবরাহকারী তুলনাকারীর দ্বারা অর্ডার করা হয়, কোন কনস্ট্রাক্টর ব্যবহার করা হয় তার উপর নির্ভর করে।
  • BlockingQueues-এ যদি কোনো নাল অপারেশন করা হয়, NullPointerException নিক্ষেপ করা হয়।
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION