CodeGym /Java Blog /এলোমেলো /অ্যারে ক্লাস
John Squirrels
লেভেল 41
San Francisco

অ্যারে ক্লাস

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

int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
আমাদের কাজ হল এই অ্যারেটিকে আরোহী ক্রমে সাজানো: ছোট থেকে বড় পর্যন্ত। শেষ পর্যন্ত, এটি এই মত হওয়া উচিত: [-234, -2, 16, 26, 35, 43, 92, 99, 167] আমরা এটি কিভাবে করব? এই কাজটি তুচ্ছ নয়। আমরা এটি আগে কখনও করিনি :/ কোন ধারণা? অনুমান করার চেষ্টা কর. এখানে একটি সমাধান:
  • অ্যারের সমস্ত উপাদানের মধ্য দিয়ে যান। প্রতিটি উপাদান পরের সাথে তুলনা করুন ([0] এর সাথে [1], [1] [2] এর সাথে, [2] এর সাথে [3], ইত্যাদি)। যদি বর্তমান উপাদানটি পরেরটির থেকে বড় হয়, আমরা সেগুলিকে অদলবদল করি এবং তারপরে পরবর্তী উপাদানে চলে যাই। যদি না হয়, তাদের যেমন আছে তেমনই রেখে যান এবং এগিয়ে যান
  • এইভাবে, উপাদানগুলির মধ্য দিয়ে প্রথম পাস করার পরে, সবচেয়ে বড় মান (167) শেষ কক্ষে থাকার নিশ্চয়তা দেওয়া হয়।
  • এখন আমরা আবার সমস্ত উপাদানের মধ্য দিয়ে যাব, কিন্তু এবার আমরা সূচী দিয়ে শুরু করব [0] উপান্তর উপাদানে (সবচেয়ে বড় সংখ্যাটি ইতিমধ্যেই তার জায়গায় রয়েছে) এবং একই তুলনা এবং অদলবদল করব। এই পাসের পরে, উপান্তর কক্ষে, আমাদের দ্বিতীয় বৃহত্তম মান (99) থাকবে।
  • যতবার আমাদের অ্যারে উপাদান রয়েছে ততবার এই প্রক্রিয়াটি পুনরাবৃত্তি করুন।
আমরা ধারণা পেয়েছি. এখন আমাদের শুধুমাত্র কোড লিখতে হবে। এটি এই মত দেখায়: অ্যারে ক্লাস এবং এর ব্যবহার - 2

public class Main {

   public static void main(String[] args) {
      
       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compare the elements in pairs.
             If they are not in the right order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
উহ... এটা একটু জটিল মনে হচ্ছে -_- এমনকি যদি সাধারণ নীতিটি বোধগম্য হয়, তবুও এমন একটি সহজ কাজ সমাধান করার জন্য আমাদেরকে অনেক কোড লিখতে হবে। ঠিক আছে, হয়তো আমরা নিজেদেরকে অতিমূল্যায়ন করেছি? আমরা যে কাজটি মোকাবেলা করেছি তা সম্ভবত এখনও আমাদের জন্য খুব জটিল। এর সহজ কিছু চেষ্টা করা যাক. উদাহরণস্বরূপ, একই নম্বর অ্যারে নিন।

int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
আমাদের কাজ হল এর বিষয়বস্তু অন্য অ্যারেতে কপি করা।

int [] numbersCopy = new int[10];
আপনি ইতিমধ্যে অ্যারে সম্পর্কে যা জানেন তা ব্যবহার করে আপনি কীভাবে এটি করবেন সে সম্পর্কে চিন্তা করুন? উদাহরণস্বরূপ, আপনি একটি লুপে নম্বর অ্যারের মাধ্যমে যেতে পারেন এবং ক্রমানুসারে এর উপাদানগুলি numbersCopy এ লিখতে পারেন :

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];
      
       for (int i = 0; i < numbers.length; i++) {
          
           numbersCopy[i] = numbers[i];
       }

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

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
      
       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
Arrays.sort () পদ্ধতি অ্যারে সাজায়। এবং এর অ্যালগরিদম আমাদের লেখা কোডের চেয়ে অনেক বেশি দক্ষ। কনসোল আউটপুট: [-234, -2, 16, 26, 35, 43, 80, 92, 99, 167] দ্রষ্টব্য: অ্যারেটিকে একটি স্ট্রিংয়ে রূপান্তর করতে, আমরা অ্যারে ক্লাসের আরেকটি পদ্ধতি ব্যবহার করেছি: Arrays.toString() . জাভাতে অ্যারেগুলি তাদের নিজের থেকে toString() পদ্ধতিকে ওভাররাইড করে না। সুতরাং, আপনি যদি সহজভাবে লিখুন

System.out.println(numbers.toString());
অবজেক্ট ক্লাসের toString() বলা হবে। একটি অ্যারের জন্য, আউটপুটটি এরকম কিছু হবে: [I@4554617c ঠিক কেন এটি আউটপুট তা নিয়ে আমরা এখন বিস্তারিত জানাব না। প্রধান জিনিস হল যে এটি স্পষ্টতই আমাদের যা প্রয়োজন তা নয়। কিন্তু Arrays.toString() আমরা যা চাই তা ঠিক করে। উপায় দ্বারা, অনুলিপি করা সহজে Arrays ক্লাসের সাথে সম্পন্ন করা হয়:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
আমরা Arrays.copyOf() পদ্ধতিতে আমাদের আসল অ্যারে (যা থেকে আমরা মান কপি করতে চাই) এবং নতুন অ্যারের দৈর্ঘ্য যা আমরা ডেটা কপি করছি। এই ক্ষেত্রে, আমরা দৈর্ঘ্য হিসাবে numbers.length নির্দেশ করেছি, যেহেতু পুরো অ্যারেটি কপি করতে চাই। যদি আমরা শুধুমাত্র প্রথম কয়েকটি উপাদান অনুলিপি করতে চাই, আমরা একটি নতুন ছোট অ্যারের দৈর্ঘ্য নির্দিষ্ট করতে পারি:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
এখানে আমরা নতুন অ্যারের দৈর্ঘ্য হিসাবে 4 নির্দিষ্ট করেছি। সেই অনুযায়ী, সংখ্যার শুধুমাত্র প্রথম 4টি উপাদান নতুন অ্যারেতে কপি করা হবে। কনসোল আউটপুট: [167, -2, 16, 99] যাইহোক, অ্যারেগুলি আপনাকে অ্যারের শুরুর পরিবর্তে মধ্য থেকে একটি অ্যারের অংশ কপি করতে দেয়:

public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
আউটপুট: [16, 99, 26, 92] সংখ্যাগুলি দ্বিতীয় অ্যারে থেকে দ্বিতীয় (অন্তর্ভুক্ত) থেকে ষষ্ঠ (অন্তর্ভুক্ত নয়) উপাদানে নতুন অ্যারেতে অনুলিপি করা হয়েছিল। আমাদের দুটি অ্যারে তুলনা করতে হতে পারে। toString() পদ্ধতির মতো , অ্যারে নিজেই সমান() পদ্ধতিকে ওভাররাইড করে না। তাই আমরা যদি তাদের এভাবে তুলনা করার চেষ্টা করি

public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
তারপর আমরা মিথ্যা পেতে. এর কারণ হল Object.equals() , যা রেফারেন্সের তুলনা করে, বলা হবে। এবং, স্পষ্টতই, তারা আলাদা! কিন্তু আমাদের যা দরকার তা হল রেফারেন্স নয়, অ্যারের বিষয়বস্তুর তুলনা করা। আমরা যা চাই তা করতে অ্যারে ক্লাস সমান() পদ্ধতিটিকে ওভাররাইড করে :

public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
আউটপুট: সত্য উপায় দ্বারা, অ্যারে ক্লাস শুধুমাত্র সাধারণ অ্যারেগুলির সাথেই নয়, দ্বি-মাত্রিকগুলির সাথেও কাজ করে:

public class Main {

   public static void main(String[] args) {

       int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("Are these two-dimensional arrays equal?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));
      
       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
আউটপুট: এই দ্বিমাত্রিক অ্যারে সমান? true [[1, 2, 3], [4, 5, 6], [7, 8, 9]] আপনি দেখতে পাচ্ছেন, Arrays.copyOf() পদ্ধতিটি একটি দ্বি-মাত্রিক অ্যারে অনুলিপি করতে সক্ষম হয়েছিল। এবং ক্লাসে দ্বি-মাত্রিক অ্যারেগুলির তুলনা এবং প্রদর্শনের জন্য বিশেষ পদ্ধতি রয়েছে: deepEquals এবং deepToString() । ভবিষ্যতে, আপনি বারবার দেখতে পাবেন (এবং এই সত্যে আনন্দিত হবেন যে) যে জাভা-এর নির্মাতারা প্রায়শই প্রোগ্রামারদের মুখোমুখি হওয়া অনেক পরিস্থিতির পূর্বাভাস দিয়েছিলেন এবং তাদের জন্য ভাষাতে প্রস্তুত সমাধান প্রয়োগ করেছিলেন। এই সমাধানগুলি ব্যবহার করা চাকা পুনরায় উদ্ভাবনের চেয়ে অনেক সহজ এবং আরও সুবিধাজনক, তাই না? :) ওরাকল ওয়েবসাইটে অ্যারে ক্লাসের ডকুমেন্টেশন পড়তে ভুলবেন না । আপনার পড়াশোনায় সৌভাগ্য কামনা করছি!
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION