CodeGym /Java Blog /এলোমেলো /ছবিতে অ্যারেলিস্ট
John Squirrels
লেভেল 41
San Francisco

ছবিতে অ্যারেলিস্ট

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

public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
}
ছবিতে অ্যারেলিস্ট - 2 প্রথমত, আসুন দেখি নতুন উপাদান যোগ করলে কেমন লাগে। ব্যবসার প্রথম ক্রম হল অভ্যন্তরীণ অ্যারের অভ্যন্তরীণ অ্যারেতে পর্যাপ্ত জায়গা আছে কিনা এবং আরও একটি উপাদান ফিট হবে কিনা তা পরীক্ষা করা। যদি স্থান থাকে, তাহলে তালিকার শেষে নতুন উপাদান যোগ করা হয়। যখন আমরা "শেষ পর্যন্ত" বলি, তখন আমরা অ্যারের শেষ অবস্থান বোঝাই না (এটি অদ্ভুত হবে)। আমরা শেষ বর্তমান উপাদান অনুসরণ অবস্থান মানে. এর সূচক হবে cars.size()। আমাদের তালিকা বর্তমানে খালি ( cars.size() == 0)। তদনুসারে, নতুন উপাদানটি 0 অবস্থানে যোগ করা হবে।

ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
ছবিতে অ্যারেলিস্ট - 3 এটা যথেষ্ট পরিষ্কার. যদি আমরা মাঝখানে, অর্থাৎ অন্যান্য উপাদানের মধ্যে সন্নিবেশ করি তাহলে কি হবে?

public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
   Car ferrari = new Car("Ferrari 360 Spider");
   Car bugatti = new Car("Bugatti Veyron");
   Car lambo = new Car("Lamborghini Diablo");
   Car ford = new Car("Ford Modneo");
  
   cars.add(ferrari);
   cars.add(bugatti);
   cars.add(lambo);
  
   cars.add(1, ford);// add ford to cell 1, which is already occupied
}
আবার, প্রথমে অ্যারেতে পর্যাপ্ত জায়গা আছে কিনা তা পরীক্ষা করে দেখুন। যদি পর্যাপ্ত স্থান থাকে, তাহলে উপাদানগুলি ডানদিকে সরানো হয় , যেখানে আমরা নতুন উপাদান সন্নিবেশ করছি সেই অবস্থান থেকে শুরু করে। আমরা অবস্থান 1 এ সন্নিবেশ করছি। অন্য কথায়, অবস্থান 3 থেকে উপাদানটি অবস্থান 4 এ, উপাদান 2 অবস্থান 3 এ এবং উপাদান 1 অবস্থান 2 এ অনুলিপি করা হয়েছে। তারপরে ছবিতে অ্যারেলিস্ট - 4টি আমাদের নতুন উপাদানটি তার জায়গায় সন্নিবেশ করা হয়েছে। পূর্ববর্তী উপাদান (bugatti) ইতিমধ্যে একটি নতুন অবস্থান থেকে কপি করা হয়েছে. ছবিতে অ্যারেলিস্ট - 5টি এখন দেখা যাক কিভাবে এই প্রক্রিয়াটি ঘটবে যদি অ্যারেতে নতুন উপাদান ঢোকানোর জায়গা না থাকে। ছবির অ্যারেলিস্ট- ৬টি স্বাভাবিকভাবেই, পর্যাপ্ত জায়গা আছে কিনা তা দেখার জন্য প্রথমে একটি পরীক্ষা করা হয়। যদি পর্যাপ্ত রুম না থাকে, তাহলে এর ভিতরে একটি নতুন অ্যারে তৈরি করা হয়ArrayListযার মাপ পুরানো অ্যারের সাইজ 1.5 প্লাস 1 আমাদের ক্ষেত্রে, নতুন অ্যারের সাইজ হবে 16। বর্তমানের সমস্ত উপাদান অবিলম্বে সেখানে কপি করা হবে। ছবিতে অ্যারেলিস্ট - 7 পুরানো অ্যারে আবর্জনা সংগ্রহকারী দ্বারা মুছে ফেলা হবে, এবং শুধুমাত্র নতুন, প্রসারিত অ্যারে থাকবে। এখন একটি নতুন উপাদান জন্য জায়গা আছে. আমরা অবস্থান 3 এ সন্নিবেশ করছি, যা দখল করা হয়. এখন পরিচিত পদ্ধতি শুরু হয়। সূচক 3 থেকে শুরু করে সমস্ত উপাদান ডানদিকে এক অবস্থানে স্থানান্তরিত হয় এবং নতুন উপাদানটি শান্তভাবে যোগ করা হয়। ছবিতে অ্যারেলিস্ট - 8টি এবং সন্নিবেশ করা হয়! এবং আমরা সন্নিবেশ সঙ্গে সম্পন্ন করছি. এখন আইটেম অপসারণ সম্পর্কে কথা বলা যাক . আপনি মনে রাখবেন যে অ্যারেগুলির সাথে কাজ করার সময় আমরা একটি সমস্যায় পড়েছিলাম: উপাদানগুলি সরানো একটি অ্যারেতে "গর্ত" তৈরি করে।প্রতিটি অপসারণের সাথে, এবং এই পরিবর্তনটি সম্পাদন করার জন্য আমাদের প্রতিবার আমাদের নিজস্ব কোড লিখতে হয়েছিল। ArrayList একই নীতি অনুসরণ করে, কিন্তু এটি ইতিমধ্যে এই প্রক্রিয়াটি প্রয়োগ করে। ছবিতে অ্যারেলিস্ট - 9 এটি এইভাবে দেখায়: ছবিতে অ্যারেলিস্ট - 10টি এবং শেষ পর্যন্ত আমরা যা চাই তা পাই: ছবিতে অ্যারেলিস্ট - 11 উপাদানটি lamboসরানো হয়েছে। এখানে আমরা মাঝখান থেকে একটি উপাদান অপসারণ করেছি। স্পষ্টতই, তালিকার শেষ থেকে একটি উপাদান সরানো দ্রুততর, যেহেতু উপাদানটি অন্য সব স্থানান্তর করার প্রয়োজন ছাড়াই সরানো হয়। অভ্যন্তরীণ অ্যারের মাত্রা এবং এটি মেমরিতে কীভাবে সাজানো হয়েছে সে সম্পর্কে কিছুক্ষণের জন্য আবার কথা বলা যাক। একটি অ্যারে সম্প্রসারণ কিছু সম্পদ লাগে. তদনুসারে, একটি তৈরি করবেন নাArrayListডিফল্ট আকারের সাথে যদি আপনি নিশ্চিত হন যে এতে কমপক্ষে 100টি উপাদান থাকবে। আপনি 100 তম উপাদান সন্নিবেশ করার সময় অভ্যন্তরীণ অ্যারেটি 6 বার প্রসারিত করতে হবে এবং প্রতিবার সমস্ত উপাদান স্থানান্তর করতে হবে।
  • 10টি উপাদান থেকে 16 পর্যন্ত
  • 16টি উপাদান থেকে 25 পর্যন্ত
  • 25 থেকে 38 পর্যন্ত
  • 38 থেকে 58 পর্যন্ত
  • 58 থেকে 88 পর্যন্ত
  • 88 থেকে 133 পর্যন্ত (অর্থাৎ পুরানো অ্যারের টাইম 1.5 প্লাস 1)
আপনি কল্পনা করতে পারেন, এটি বেশ সম্পদ-নিবিড়। সুতরাং, যদি আপনি ইতিমধ্যেই (এমনকি আনুমানিক) প্রয়োজনীয় সংখ্যক আইটেম জানেন তবে একটি নির্দিষ্ট আকারের অ্যারের সাথে একটি তালিকা তৈরি করা ভাল:

ArrayList<Car> cars = new ArrayList<>(100);
এখন 100টি উপাদানের একটি অ্যারের জন্য মেমরি একবারে বরাদ্দ করা হবে, অ্যারেটিকে আরও দক্ষ করে তুলবে (এটি প্রসারিত করার প্রয়োজন হবে না)। এই কৌশলটির একটি উল্টো দিকও রয়েছে। যখন আপনি একটি থেকে বস্তুগুলি সরিয়ে দেন ArrayList, তখন অভ্যন্তরীণ অ্যারের আকার স্বয়ংক্রিয়ভাবে হ্রাস পায় না। ধরুন আমাদের কাছে ArrayList88টি উপাদানের একটি সম্পূর্ণ সম্পূর্ণ অভ্যন্তরীণ অ্যারে রয়েছে: ছবিতে অ্যারেলিস্ট - 12 প্রোগ্রামটি চলার সাথে সাথে আমরা 77টি উপাদান সরিয়ে ফেলি, তাই শুধুমাত্র 11টি অবশিষ্ট থাকে: ছবিতে অ্যারেলিস্ট - 13টি আপনি কি ইতিমধ্যেই অনুমান করেছেন সমস্যাটি কী? বুঝেছ, স্মৃতির অদক্ষ ব্যবহার! আমরা এখানে শুধুমাত্র 11টি অবস্থান ব্যবহার করছি, কিন্তু আমরা 88টি উপাদানের জন্য মেমরি বরাদ্দ করেছি। এটি আমাদের প্রয়োজনের চেয়ে 8 গুণ বেশি! এই ক্ষেত্রে, আমরা ArrayListক্লাসের একটি বিশেষ পদ্ধতির সাহায্যে আমাদের মেমরি ব্যবহারকে অপ্টিমাইজ করতে পারি:trimToSize(). এই পদ্ধতিটি অভ্যন্তরীণ অ্যারের দৈর্ঘ্যকে এটিতে বর্তমানে সংরক্ষিত উপাদানের সংখ্যায় "ছাঁটা" করে। ছবিতে অ্যারেলিস্ট - 14 এখন আমরা যতটুকু মেমরি প্রয়োজন ততটুকুই বরাদ্দ করেছি! :)
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION