Java Deque হল একটি ডেটা স্ট্রাকচার যা একটি সাধারণ সারি এবং স্ট্যাককে একত্রিত করে। আপনি Deque এর মাথা এবং লেজ উভয় উপাদান যোগ এবং অপসারণ করতে পারেন. "প্রথাগত" সারিতে আপনি লাইনের লেজে উপাদান যুক্ত করেন (শেষ উপাদানের পরে) এবং সারির মাথা থেকে উপাদানগুলি সরান। এই নীতিটিকে বলা হয় ফার্স্ট ইন ফার্স্ট আউট (FIFO) এবং এটি বাস্তব জীবনে গ্রাহকদের সাধারণ লাইনের মতো কাজ করে। জাভা কিউ হল একটি ইন্টারফেস, কালেকশন ফ্রেমওয়ার্কের একটি অংশ। স্ট্যাক নামে একটি গুরুত্বপূর্ণ ডেটা স্ট্রাকচারও রয়েছে, একটি তালিকা যা সম্পূর্ণ বিপরীত নীতিতে উপাদানগুলির সাথে কাজ করে, LIFO — শেষ পর্যন্ত, প্রথমে আউট৷ এটি প্লেটগুলির একটি স্ট্যাকের মতো, যোগ করা বা অপসারণ করা শুধুমাত্র শীর্ষে সম্ভব।
সারি বনাম ডেক
Deque একটি অদ্ভুত ধরনের সারি: আপনি লেজ এবং লাইনের মাথা উভয়ই নতুন উপাদান যোগ করতে পারেন। অপসারণের সাথে একই গল্প: আপনি এই কাঠামো থেকে শেষ বা প্রথম উপাদানটি সরাতে পারেন। অতএব, এটি স্ট্যাক এবং কিউ এর মিশ্রণ বলে মনে হচ্ছে। "Deque" নামের অর্থ "ডাবল এন্ডেড কিউ"। "ডেক" কার্ডের "ডেক" এর মত উচ্চারিত হয় এবং আপনি কি জানেন? এটি কার্ডের একটি বাস্তব ডেকের সাথে কিছুটা সাদৃশ্যপূর্ণ: আপনি নীচে বা এই জাতীয় ডেকের উপরে থেকে একটি কার্ড নিতে পারেন। কিছু রৈখিক কাঠামোর উভয় দিক থেকে উপাদান যোগ করতে বা সরাতে চান? Deque ব্যবহার করুন। জাভা 8 বা প্রায় অন্য কোন সংস্করণ এটি সমর্থন করে। একটি সাধারণ লেগো ইট এবং ইট দিয়ে তৈরি এক-কলামের "টাওয়ার" কল্পনা করুন। আপনি টাওয়ারের শীর্ষে বা নীচে একটি নতুন ইট যোগ করতে পারেন। আপনি উভয় পক্ষ থেকে একটি ইট অপসারণ করতে পারেন। এখানে আমাদের একটি উদাহরণ রয়েছে: আমরা উপরের দিকে সমস্ত হলুদ ইট এবং নীচে সমস্ত লাল যুক্ত করি। আমরা শীঘ্রই জাভা কোড দিয়ে এই উদাহরণটি প্রদর্শন করব। সুতরাং আপনি একটি জাভা ডেক এর উভয় প্রান্ত থেকে সারিবদ্ধ এবং ডিকিউ করতে পারেন, এর মানে আপনি সারি এবং স্ট্যাক উভয় হিসাবে একটি Deque ব্যবহার করতে পারেন। জাভাতে স্ট্যাক সম্পর্কে পড়ুন: জাভা স্ট্যাক 101: স্ট্যাক ক্লাসে প্রবেশ করা জাভাতে কিউ সম্পর্কে পড়ুন: জাভা কিউ ইন্টারফেস এবং এর বাস্তবায়ন
Deque এর বৈশিষ্ট্য
জাভাতে Deque হল একটি ইন্টারফেস, যা বাস্তবায়নগুলি একটি পরিবর্তনযোগ্য অ্যারের সমর্থন প্রদান করে। সুতরাং আপনার কাছে সীমাবদ্ধতা-মুক্ত ক্ষমতার একটি অ্যারে রয়েছে এবং আপনি আপনার প্রয়োজন অনুসারে নতুন উপাদান যুক্ত করতে পারেন।
একাধিক থ্রেড দ্বারা সমসাময়িক অ্যাক্সেস Deque দ্বারা সমর্থিত নয়
বাহ্যিক সিঙ্ক্রোনাইজেশনের অনুপস্থিতির ক্ষেত্রে Deque থ্রেড-নিরাপদ নয়।
অ্যারে ডিকে কোনো নাল উপাদান অনুমোদিত নয়।
Deque জাভা ইন্টারফেস ঘোষণা
publicinterfaceDeque<E>extendsQueue<E>
জাভা ডেক পদ্ধতি
java.util.Deque হল একটি ইন্টারফেস যা জাভা কিউ ইন্টারফেসকে প্রসারিত করে এবং একটি ডবল শেষ সারির প্রতিনিধিত্ব করে। তাই আপনি একটি Deque এর সাথে কাজ করার সময় সমস্ত জাভা কিউ পদ্ধতি ব্যবহার করতে পারেন। Deque স্ট্যাক ইন্টারফেস প্রসারিত না করা সত্ত্বেও, Deque ইন্টারফেস এমন পদ্ধতিগুলিকে সংজ্ঞায়িত করে যা আপনাকে সাধারণ স্ট্যাক অপারেশন যেমন push , peek এবং pop করতে সক্ষম করে ।
বুলিয়ান অ্যাড(এলিমেন্ট) ডেকের লেজে একটি উপাদান যোগ করে। সাফল্যের উপর সত্য প্রত্যাবর্তন করে, বর্তমানে কোনো স্থান উপলব্ধ না হলে একটি IllegalStateException নিক্ষেপ করে।
addFirst(element) Deque এর মাথায় একটি উপাদান যোগ করে।
addLast(element) Deque এর লেজে একটি উপাদান যোগ করে।
offer(element) লেজে একটি উপাদান যোগ করে এবং সন্নিবেশ সফল হয়েছে কিনা তা ব্যাখ্যা করার জন্য একটি বুলিয়ান প্রদান করে।
offerFirst(element) মাথায় একটি উপাদান যোগ করে এবং সন্নিবেশ সফল হয়েছে কিনা তা ব্যাখ্যা করার জন্য একটি বুলিয়ান ফেরত দেয়।
offerLast(element) লেজে একটি উপাদান যোগ করে এবং সন্নিবেশ সফল হয়েছে কিনা তা ব্যাখ্যা করার জন্য একটি বুলিয়ান ফেরত দেয়।
iterator() deque এর জন্য একটি পুনরাবৃত্তিকারী প্রদান করে।
descendingIterator() একটি ইটারেটর প্রদান করে যার এই ডেকের বিপরীত ক্রম রয়েছে।
push(element) মাথায় একটি উপাদান যোগ করে।
পপ(উপাদান) মাথা থেকে একটি উপাদান সরিয়ে দেয় এবং এটি ফেরত দেয়।
removeFirst() মাথার উপাদানটিকে সরিয়ে দেয়।
removeLast() লেজের এলিমেন্টটিকে সরিয়ে দেয়।
poll() এই deque দ্বারা উপস্থাপিত সারির মাথাটি পুনরুদ্ধার করে এবং অপসারণ করে (অন্য কথায়, এই deque এর প্রথম উপাদান), অথবা যদি এই deque খালি থাকে তাহলে null প্রদান করে।
pollFirst() এই ডিকটির প্রথম উপাদানটি পুনরুদ্ধার করে এবং অপসারণ করে, অথবা যদি এই ডিকটি খালি থাকে তবে শূন্য প্রদান করে।
pollLast() এই ডিকের শেষ উপাদানটি পুনরুদ্ধার করে এবং অপসারণ করে, অথবা যদি এই ডিকটি খালি থাকে তবে শূন্য প্রদান করে।
peek() পুনরুদ্ধার করে, কিন্তু অপসারণ করে না, এই deque দ্বারা উপস্থাপিত সারির প্রধান (অন্য কথায়, এই deque-এর প্রথম উপাদান), অথবা যদি এই deque খালি থাকে তাহলে নাল ফেরত দেয়।
peekFirst() পুনরুদ্ধার করে, কিন্তু অপসারণ করে না, এই deque-এর প্রথম উপাদান, অথবা যদি এই deque খালি থাকে তাহলে null দেয়।
peekLast() পুনরুদ্ধার করে, কিন্তু অপসারণ করে না, এই deque-এর শেষ উপাদান, অথবা যদি এই deque খালি থাকে তাহলে null দেয়।
এখানে নীচের সারণীতে সমস্ত পদ্ধতি গোষ্ঠী দ্বারা বিভক্ত। আপনি দেখতে পাচ্ছেন যে একটি উপাদান যোগ করার এবং অপসারণ করার জন্য বিভিন্ন পদ্ধতি রয়েছে। উদাহরণস্বরূপ, রিমুভ ফার্স্ট() এবং পপ() উভয়ই ডিক থেকে প্রথম উপাদানটি সরিয়ে দেয়। দ্বিতীয়টি স্ট্যাক থেকে "এসেছে"। তার মানে আপনি যদি আপনার ArrayDeque শুধুমাত্র একটি স্ট্যাক হিসাবে ব্যবহার করেন, তাহলে অপসারণ করতে pop() ব্যবহার করুন, যোগ করতে push() এবং পরীক্ষা করতে peek() ব্যবহার করুন। এটি অন্যান্য ডেভেলপারদের জন্য আপনার কোডকে আরও বুদ্ধিমান করে তোলে।
প্রথম উপাদান (প্রধান)
শেষ উপাদান (লেজ)
অপারেশন
ব্যতিক্রম নিক্ষেপ
বিশেষ মান
ব্যতিক্রম নিক্ষেপ
বিশেষ মান
সন্নিবেশ
অ্যাডফার্স্ট(ই)/পুশ(ই)
অফার ফার্স্ট(ই)
যোগশেষ(ই)
অফার শেষ()
অপসারণ
রিমুভ ফার্স্ট()/পপ()
ভোটপ্রথম()
রিমুভ লাস্ট()
ভোট শেষ()
পরীক্ষা করা
GetFirst()
পিক ফার্স্ট()/পিক()
GetLast()
পিক লাস্ট()
Deque বাস্তবায়ন
Java Deque হল একটি ইন্টারফেস এবং জাভা কালেকশন এপিআইতে এর বাস্তবায়ন রয়েছে:
LinkedList ক্লাস একটি সারি বা একটি deque মডেল করার জন্য অভ্যন্তরীণভাবে একটি ডবল লিঙ্কযুক্ত তালিকা ব্যবহার করে। ArrayDeque ক্লাস একটি অ্যারের মধ্যে অভ্যন্তরীণভাবে উপাদান সংরক্ষণ করে। যদি উপাদানের সংখ্যা অ্যারের ভলিউম অতিক্রম করে, একটি নতুন অ্যারে বরাদ্দ করা হয়, এবং সমস্ত উপাদান সরানো হয়। এর মানে ArrayDeque চাহিদা অনুযায়ী বৃদ্ধি পায়।
ArrayDeque ক্লাস
ArrayDeque <E> ক্লাস হল একটি সাধারণ দুটি দিকনির্দেশক সারি, যা AbstractCollection ক্লাস থেকে কার্যকারিতা উত্তরাধিকার সূত্রে প্রাপ্ত এবং Deque ইন্টারফেস ব্যবহার করে। ArrayDeque deque এবং resizable-array ব্যবহার করার সুবিধা প্রদান করে। প্রাথমিকভাবে, অ্যারেটি আকার 16 দিয়ে আরম্ভ করা হয়। এটি একটি দ্বিমুখী সারি হিসাবে প্রয়োগ করা হয়, যেখানে এটি মাথা এবং পুচ্ছ নামে দুটি পয়েন্টারকে সমর্থন করে। এটি AbstractCollection ক্লাসের উত্তরাধিকারী এবং Deque ইন্টারফেস প্রয়োগ করে। ArrayDeque ক্লাস সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট হল:
আপনি লেজ এবং ArrayDeque এর মাথা থেকে উপাদান যোগ বা অপসারণ করতে পারেন
নাল উপাদান অনুমোদিত নয়
বাহ্যিক সিঙ্ক্রোনাইজেশনের অনুপস্থিতিতে ArrayDeque থ্রেড নিরাপদ নয়।
ArrayDeque এর কোন ক্ষমতা সীমাবদ্ধতা নেই।
ArrayDeque ক্লাস কনস্ট্রাক্টর
ArrayDeque() একটি খালি সারি তৈরি করে।
ArrayDeque (সংগ্রহ <? E> সংগ্রহকে প্রসারিত করে) সংগ্রহ সংগ্রহের উপাদানে ভরা একটি সারি তৈরি করে।
ArrayDeque (int ধারণক্ষমতা) প্রাথমিক ধারণ ক্ষমতা সহ একটি সারি তৈরি করে । আপনি যদি প্রাথমিক ক্ষমতা নির্দিষ্ট না করেন তবে ডিফল্ট ক্ষমতা 16।
জাভা ডিক উদাহরণ - অ্যারেডেক
নিবন্ধের শুরু থেকে Lego টাওয়ার উদাহরণ মনে রাখবেন? লেগো ইট দিয়ে এক-কলামের টাওয়ার তৈরি করার জন্য একটি ক্লাস তৈরি করি। ইট লাল, হলুদ বা নীল হতে পারে। আমাদের টাওয়ার নির্মাণের নিয়ম: আমরা নীচে লাল ইট এবং উপরের দিকে হলুদ ইট রাখি। বড় জাভা ডেক উদাহরণ
//enum with colorspublicenumColor{RED,YELLOW,BLUE;}//class for the standard Lego Brick. You can connect or disconnect the Brick, it has colorpublicclassLegoBrick{Color color;boolean isConnected;publicvoidconnect(){System.out.println("This brick is connected");this.isConnected =true;}publicvoiddisconnect(){System.out.println("Disconnected");
isConnected =false;}publicLegoBrick(Color color,boolean isConnected){this.color = color;this.isConnected = isConnected;}publicColorgetColor(){return color;}publicbooleanisConnected(){return isConnected;}@OverridepublicStringtoString(){return"LegoBrick{"+"color="+ color +", isConnected="+ isConnected +'}';}}
এখানে আমাদের টাওয়ার ক্লাস। আমরা একটি টাওয়ার শুরু করি। শুরু করা টাওয়ারটি লাল এবং হলুদের পরিমাণের উপর নির্ভর করে। আমরা টাওয়ারে ইট যোগ করতে পারি বা অপসারণ করতে পারি। হলুদ হলে আমরা উপরের দিকে ইট যোগ করি এবং লাল হলে নীচে যোগ করি।
importjava.util.ArrayDeque;publicclassLegoTower{ArrayDeque<LegoBrick> myTower;int quantityOfReds;int quantityOfYellows;publicvoidaddBrickToTower(LegoBrick newLegoBrick){if(newLegoBrick.getColor()==Color.YELLOW){this.myTower.offerLast(newLegoBrick);
quantityOfYellows++;}//we can use addFirst(e)/push(e) instead of offerFirst hereif(newLegoBrick.getColor()==Color.RED){
myTower.offerFirst(newLegoBrick);
quantityOfReds++;}}publicvoid removeBrickFromTower (LegoBrick legoBrick){if(legoBrick.getColor()==Color.YELLOW){this.myTower.removeLast();
quantityOfYellows--;}if(legoBrick.getColor()==Color.RED){
myTower.removeFirst();
quantityOfReds--;}
legoBrick.isConnected =false;}publicLegoTower(int quantityOfReds,int quantityOfYellows){
myTower =newArrayDeque<>();this.quantityOfReds = quantityOfReds;this.quantityOfYellows = quantityOfYellows;for(int i =0; i < quantityOfReds; i++){LegoBrick redLegoBrick =newLegoBrick(Color.RED,false);
myTower.addFirst(redLegoBrick);
redLegoBrick.isConnected =true;}for(int i =0; i < quantityOfYellows; i++){LegoBrick yellowLegoBrick =newLegoBrick(Color.YELLOW,false);
myTower.addLast(yellowLegoBrick);
yellowLegoBrick.isConnected =true;}}publicvoidsetMyTower(ArrayDeque<legobrick> myTower){this.myTower = myTower;}publicvoidsetQuantityOfReds(int quantityOfReds){this.quantityOfReds = quantityOfReds;}publicvoidsetQuantityOfYellows(int quantityOfYellows){this.quantityOfYellows = quantityOfYellows;}@OverridepublicStringtoString(){return"LegoTower{"+"myTower="+ myTower +", quantityOfReds="+ quantityOfReds +", quantityOfYellows="+ quantityOfYellows +'}';}publicvoiddrawTower(){for(LegoBrick i : myTower){System.out.println(i.color);}}}publicclassMain{publicstaticvoidmain(String[] args){LegoBrick legoBrick1 =newLegoBrick(Color.YELLOW,false);
legoBrick1.connect();System.out.println(legoBrick1.toString());
legoBrick1.disconnect();System.out.println(legoBrick1.toString());LegoBrick legoBrick2 =newLegoBrick(Color.YELLOW,false);LegoBrick legoBrick3 =newLegoBrick(Color.RED,false);LegoBrick legoBrick4 =newLegoBrick(Color.RED,false);LegoBrick legoBrick5 =newLegoBrick(Color.YELLOW,false);LegoTower legoTower =newLegoTower(2,5);System.out.println("my Initiated Lego Tower: ");
legoTower.drawTower();
legoTower.addBrickToTower(legoBrick1);
legoTower.addBrickToTower(legoBrick2);
legoTower.addBrickToTower(legoBrick3);
legoTower.addBrickToTower(legoBrick4);
legoTower.addBrickToTower(legoBrick5);System.out.println("My LegoTower after adding some elements: ");
legoTower.drawTower();
legoTower.removeBrickFromTower(legoBrick1);
legoTower.removeBrickFromTower(legoBrick3);System.out.println("We removed one red and one yellow brick:");
legoTower.drawTower();}}
এই প্রোগ্রাম চালানোর ফলাফল:
my Initiated LegoTower:
RED
RED
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
My LegoTower after adding some elements:
RED
RED
RED
RED
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
We removed one red and one yellow brick:
RED
RED
RED
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
YELLOW
Process finished with exit code 0
কিসের অপেক্ষা?? উপরে লাল কেন? না, তারা করে না। তারা শুধু প্রথম (নীচে) থেকে শেষ (শীর্ষ) পর্যন্ত কনসোলে প্রিন্ট আউট করেছে। সুতরাং আপনি যদি উপরের ইটগুলির সাথে ছবির মতো কিছু দেখতে চান তবে আপনি LegoTower ক্লাসের drawTower পদ্ধতি পরিবর্তন করতে পারেন। এটি একটি খুব সহজ কাজ!
যোজিত তালিকা
তালিকা ইন্টারফেস আইটেম যোগ করার ক্রম রাখে এবং সূচক দ্বারা আইটেম অ্যাক্সেসের অনুমতি দেয়। Deque একটি দ্বি-মুখী সারি, এবং এটি উভয় দিক থেকে উপাদান যোগ এবং অপসারণ সমর্থন করে। LinkedList প্রধানত একটি তালিকা বাস্তবায়ন হিসাবে পরিচিত, কিন্তু এছাড়াও এই শ্রেণীটি Deque প্রয়োগ করে, এবং এটি আমাদের null সহ যেকোনো বস্তুর সমন্বয়ে একটি দ্বিমুখী সারি তৈরি করতে দেয়। LinkedList হল উপাদানের একটি সংগ্রহ। আমরা এটি ক্লাসের কোড উত্সে দেখতে পাচ্ছি, এই সময় ক্ষেত্রগুলিতে মনোযোগ দিন: এখানে আমরা একটি উদাহরণ যোগ করি, তবে আপনি যদি LinkedList সম্পর্কে আরও জানতে চান তবে এই CodeGym নিবন্ধে স্বাগতম ।
জাভাতে লিঙ্কযুক্ত তালিকা বাস্তবায়ন, উপাদান যোগ করা এবং অপসারণ করা। উদাহরণ
আসুন অনুশীলনে এই অপারেশনগুলি চেষ্টা করি। প্রথম, জাভা লিঙ্কডলিস্ট বাস্তবায়ন: স্ট্রিংগুলির একটি লিঙ্কডলিস্ট তৈরি করা, সেখানে 3টি উপাদান যোগ করা। তারপর একটি সরান, তারপর মাঝখানে একটি যোগ করুন.
publicclassMyLinkedTest{publicstaticvoidmain(String[] args){String h1 ="my";String h2 ="favorite";String h3 ="book";// LinkedList implementation in JavaLinkedList<string> linkedList =newLinkedList();
linkedList.add(h1);
linkedList.add(h2);
linkedList.add(h3);System.out.println("my list after adding 3 elements:");System.out.println(linkedList);System.out.println("element #2 of my list:");System.out.println(linkedList.get(2));
linkedList.remove(1);System.out.println("my list after removing #1:");System.out.println(linkedList);
linkedList.add(1,"first");System.out.println("my list after adding an element in the middle");System.out.println(linkedList);}
এই প্রোগ্রাম চালানোর ফলাফল:
my list after adding 3 elements:
[my, favorite, book]
element #2 of my list:
book
my list after removing #1:
[my, book]
my list after adding an element in the middle
[my, first, book]