জাভা প্রোগ্রামিং # ৮ – অ্যারে – ২

অ্যারে কি শুধু সিংগেল ডাইমেনশনের হয়? সে আর কিছু হয় না? অ্যারে নিশ্চয়ই ফরেভার সিংগেল না! তার অনেক রকমের ডিমেনশন ই থাকতে পারে। কীভাবে?

ডাইমেনশন কি জিনিস

সহজ ভাষাতে বললে একটা অ্যারে এর ডিমেনশন হচ্ছে তার সাইজ ডিক্লেয়ার করতে যে কয়টা ভেরিয়েবল বা ইনপুট দরকার হয়। কঠিন কথা। খোলাসা করা যাক।

বুঝার সুবিধার্থে ধরে নিতে পারো জগতের সব অ্যারে হচ্ছে একটা ম্যাট্রিক্স।

তো আমরা যখন সাধারণ অ্যারে ডিক্লেয়ার করি, যেমন –

float[] ar = {1.0, 2.99, 3.98};

তখন এর ডিমেনশন কি? এখানে খেয়াল করলে দেখা যাবে, ম্যাট্রিক্সের রো কয়টা? – ১ টা। আর কলাম কয়টা তাহলে? যে কয়টা ইলিমেন্ট আছে ততটা। মানে ৩। কোন কারণে যদি কলাম কয়টা ধরতে না পারো (না পারার কারণ দেখি না) তাহলে নিচের কোড লিখে জেনে নিতে পারবে।

int col = ar.length;

আমাদের এই উদাহরণের অ্যারে এর ডিমেনশন কি তাহলে? রো X কলাম ধরলে (1 X 3) হচ্ছে এর শেপ।

বিঃদ্রঃ কোন অ্যারে বা ম্যাট্রিক্সের (রো X কলাম) হচ্ছে তার শেপ।

তাহলে ডিমেনশন কত? – ২ , কেন? কারণ এই অ্যারে এর সাইজ ডিক্লেয়ার করতে আমাদের ২ টা ইনপুট / মান লাগবে একটা রো সাইজ আরেকটা কলাম সাইজ । যদি এখানে একটা (2X3) অথবা (3X3) শেপের অ্যারে থাকতো তাহলে কি বলতাম তাদের? আর যদি (2X3X4) থাকে তখন?

মাল্টি ডিমেনশন এর অ্যারে

কীভাবে ডিক্লেয়ার করতে হয়?

একগাদা ভ্যাজর ভ্যাজর করার আগে দেখে নেই জাভাতে ২ডি, ৩ডি এসব অ্যারে কীভাবে ডিক্লেয়ার করতে হয়।

2D Array

int[][] array2D = new int[row][col];

3D Array

int[][][] array2D = new int[x][y][z];

এখানে একটা ব্যাপার দেখো, ডিমেনশন যতটা, টাইপ নেমের পরে ঠিক ততটা [] সাইন দেয়া লাগছে । এইটা একটা চিটশিট টাইপ ট্রিক। তুমি [] এর সংখ্যা দেখে ধরতে পারবে যে ডিমেনশন আসলে কত।

অ্যারে অ্যাকসেস করা – কয়টা লুপ বাহে ?

যে কয়টা ডিমেনশন সে কয়টা লুপ। একের বেশি ডিমেনশন হলে প্রথম লুপের পরে বাকিগুলো সব নেস্টেড হয়ে যাবে। ক্লাসিক C কনসেপ্ট। উদাহরণ দেখাই ।

ধরা যাক তোমার একটা ২ডি অ্যারে আছে, (2X3) আকারের/শেপের। তোমার প্রোগ্রামের কাজ হচ্ছে অ্যারে এর ইলিমেন্ট গুলো ইনপুট নেয়া। তাহলে জাভা কোড দাঁড়াবে এমন –

import java.util.Scanner;

public class Array2D {

    public static void main(String[] args) {
        int[][] ar2D = new int[2][3];

        Scanner in = new Scanner(System.in);

        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) {
                ar2D[i][j] = in.nextInt();
            }
        }

        in.close();
    }
}

যদি ৩ডি অ্যারে থাকতো যেমন (2X3X5) শেপের তখন?

import java.util.Scanner;

public class Array3D {
    public static void main(String[] args) {
        int[][][] ar3D = new int[2][3][5];

        Scanner in = new Scanner(System.in);

        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 3; j++) {
                for (int k = 0; k < 5; k++) {
                    ar3D[i][j][k] = in.nextInt();
                }
            }
        }

        in.close();
    }
}

এর বেশি ডিমেনশন এর অ্যারে থাকাও সম্ভব কিন্তু বেশি জটিল হয়ে যাবে বিধায় দেখাচ্ছি না। (ডেটা সায়েন্স নিয়ে ঘাটাঘাটি করতে গেলে ওসব জিনিসের দেখা পাবে, তখন দেখবে লোকে অত বড় অ্যারে হ্যান্ডেল করার টেকনিক অলরেডি বের করে রেখেছে।)

এইবার – এই জিনিস মেমরীতে ক্যামনে যায়?

ওয়েল জাভা না মাল্টি ডাইমেনশনের অ্যারে সরাসরি সাপোর্ট করে না। তাইলে কোড যে লেখলাম? একি ভানুমতি! একি ইন্দ্রজাল! কোড কম্পাইল হয় রান হয় ইনপুট নেয় (প্রিন্ট করলে রেজাল্ট ও দেখাবে) তাইলে জাভা কেন সাপোর্ট করবে না?

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

ধরো আমাদের একটা ২ডি অ্যারে আছে। এইটার ইলিমেন্ট গুলো হচ্ছে –

ar2D = {
    2, 3, 4,
    5, 6, 7,
    9, 90, 100
}

তাহলে এখানে রো হচ্ছে ৩ টা, কলাম ও ৩ টা। (3X3) শেপের অ্যারে। জাভা যা করবে সেটা হচ্ছে, সে ৩ টা রো কে ৩ টা ১ডি অ্যারে ধরে নিবে। এরপর সেভাবে কাজ করবে।

row-1 : 2, 3, 4
row-2 : 5, 6, 7
row-3 : 9, 90, 100

মানে হচ্ছে সে তোমার জন্য প্রথমে ৩ টা রো অ্যালোকেট করবে। এরপর প্রতি রো এর অ্যারে তে ধরে সব ইলিমেন্ট বসিয়ে দিবে। তাহলে ৩ডি এর জন্য কীভাবে হয়। জিনিসটা ভিসুয়ালাইজ করা কঠিন এখানে। কিন্তু পুরোটা এভাবে দেখানো যায়।

  • প্রতি রো এর জন্য একটা ২ডি অ্যারে ।
  • প্রতি ২ডি অ্যারের এর প্রতি রো এর জন্য আবার একটা করে ১ডি অ্যারে । মানে নেস্টেড হয়ে যাচ্ছে। রো এর অতলে রো , তার অতলে রো। বুঁড়ো শালিকের ঘারে রোঁ!

যদি ৪ডি হয়? নেস্টেড হয়েই যাবে । হ্যাশট্যাগ ইনসেপশন। এ কারণে জাভাতে মাল্টি ডিমেনশন অ্যারে কে বলা হয় অ্যারে ইনসাইড অ্যারে।

Imgur

আচ্ছা যেহেতু যে কয়টা রো সে কয়টা ১ ডি অ্যারে বানাচ্ছে এবং কলাম সাইজ হচ্ছে গিয়ে সেই ১ডি রো এর সাইজ, তাহলে আমরা কি চাইলে ডিকেলারেশন এর সময় কলাম উল্লেখ না করলেও পারবো?এরর দেখাবে না? মানে যদি এমন কোড লেখি আরকি –

int[][] ar = new int[3][];
// এইটা কি এরর দিবে?

Dangling অ্যারে

না এরর দেখাবে না। অ্যারে কন্টিনিউয়াস মেমরি স্পেস দখল করে তাই না? তাই অ্যারে ডিক্লারেশনের সময় আমাদের বলে দিতে হয় যে কয়টা কন্টিনিউয়াস মেমরি স্পেস সে দখল করে নিবে। আমরা জাস্ট বলে দিবো যে রো কয়টা। যেহেতু প্রতি রো এর জন্য একটা করে ১ডি অ্যারে তৈরি হবেই তাহলে আমরা চাইলে একেক কলাম বা ১ডি অ্যারে এর জন্য একেক সাইজ ও রাখতে পারবো!

Dangling অ্যারে সেসব ক্ষেত্রে ভালো যেখানে তুমি আগে থেকে জানো না যে অ্যারে এর প্রতি রো এর জন্য কলাম কয়টা। আর এর জন্য এক্সট্রা কিছু কাজ করতে হবে। কেন? কারণ হচ্ছে এমনিতে যদি আগে থেকে ডিক্লারেশন এর সময় কলাম সাইজ বলে দিতাম, জেভিএম নিজে মেমরী অ্যালোকেট করে নিত, যেহেতু এখানে বলি নাই, জেভিএম শুধু রো কয়টা তা জানে, প্রতি রো এর জন্য তাকে বলে দিতে হবে যে সাইজ কত এবং প্রতি রো এর জন্য ইন্সটেনশিয়েট ও করে নিতে হবে (১ডি অ্যারে করতে হবে, পুরোটা না) । তাহলে কোড এমন হবে।

import java.util.Scanner;

public class DanglingArray {
    public static void main(String[] args) {
        int[][] danglingArray = new int[3][];
        Scanner in = new Scanner(System.in);

        for (int i = 0; i < 3; i++) {
            int size = 5; // ধরে নিলাম সাইজ ৫
            danglingArray[i] = new int[size];

            // you can also randomize size by taking input

            // take input
            for (int j = 0; j < size; j++) {
                // use scanner
            }
        }

        in.close();
    }
}

আচ্ছা প্রতি রো তে যদি আগে থেকে ইন্সটেনশিয়েট করা অ্যারে এসাইন করি?

ভালো বুদ্ধি। এইটাও করা যাবে। তাহলে আমরা Dangling অ্যারে এর আরেকটা ইউস পেলাম। আমরা এইটা দিয়ে অনেকগুলো অ্যারে এর একটা অ্যারে বানাতে পারবো!

এমন হবে অনেকটা –

public class ArrayInsideArray {
    public static void main(String[] args) {
        int[][] arrayHolder = new int[2][];

        int[] ar1 = {1, 2, 3};
        int[] ar2 = {4, 7, 9, 11, 15};

        arrayHolder[0] = ar1;
        arrayHolder[1] = ar2;

        // you can use a loop and print to verify!
    }
}

array.length আর array[index].length এর পার্থক্য কী?

  • array.length রো এর সংখ্যা বলে ।
  • array[index].lengthindex নাম্বার রো এর যে ১ডি অ্যারে মানে কলাম তার কয়টা ইলিমেন্ট সেটা বলে।

তাহলে এতক্ষণ যে ধরে ধরে লুপের কন্ডিশনে ২, ৩ এগুলো লিখলাম সেটা না করলেও চলতো? হ্যা চলতো। length কল করলেই চলতো। ল্যাঙ্গুয়জে কিছু দিলে সেটা ইউস করতে হয়। ফেলে রাখতে হয় না 😉 জাভার সুবিধা হচ্ছে অনেক কাজের জিনিস এতে দেয়া আছে যেগুলো ম্যানুয়ালি লিখে সময় নষ্ট করতে হয় না। এই যেমন একটা অ্যারে এর সাইজ বের করা।

Imgur

অ্যারে এর সাইজ কি আগে থেকে ইনপুট নেয়া যায়?

মানে কয়টা রো কয়টা কি এগুলো ইউজার থেকে ইনপুট নিয়ে অ্যারে বানাতে চাও? হ্যা যায়। সেজন্য অ্যারে ডিক্লেয়ার করার আগে তোমাকে ইনপুটের কাজ সেরে নিতে হবে।

int row = scanner.nextInt();
int col = scanner.nextInt();

int[][] ar = new int[row][col];

জাভা এর Arrays ক্লাস

জাভাতে বিল্ট ইন Arrays ক্লাস আছে। এর অনেকগুলো মেথড আছে যেগুলো দিয়ে অ্যারে রিলেটেড বিভিন্ন কাজ যেমন অ্যারেতে সার্চ করা, সর্ট করা, ম্যাক্সিমাম মিনিমাম বের করা ইত্যাদি করা যায়। ( জীবন কি সহজ! )

তো আমি একটা কাজের জিনিস দেখাই সেখান থেকে। ধরো তোমার একটা ১ডি অ্যারে আছে সেটার সব ইলিমেন্ট কুইক প্রিন্ট করে দেখাতে চাও, লুপ লেখার টাইম নাই। এখন কি করবে?

int[] ar = {23, 45, 56, 76};
System.out.println(Arrays.toString(ar));

তোমার সমস্যা সমাধান হয়ে যাবে। লিখে রান করে দেখো। আর হ্যা এর জন্য java.util.Arrays ইম্পোর্ট করে নিতে হবে।

এসাইনমেন্ট

  • দুইটা 3X3 শেপের অ্যারে ডিক্লেয়ার করে ভ্যালু ইনপুট নিবা। এরপর এদের প্রতি ইলিমেন্টের যোগফল আরেকটা নতুন অ্যারেতে স্টোর করবা। শেষে নতুন অ্যারে প্রিন্ট করবা। (হিন্টঃ ম্যাট্রিক্স যোগ করা, গুগল করতে পারো)

  • এবার সেম স্টাইলে ২ অ্যারে এর গুণফল বের করবা। (ম্যাট্রিক্স গুণ)

  • ইউজারকে রো কলাম ইনপুট দিতে দাও, এরপর গুণফল বের করো। ম্যাট্রিক্স গুণের কন্ডিশন দিয়ে করবা যে গুণ করা সম্ভব কিনা। না হলে প্রিন্ট করে দিবা যে সম্ভব না।

  • 3X3 অ্যারে (ম্যাট্রিক্স) নাও। ভ্যালু বসাও, এবার নির্ণায়ক / Determinant বের করো।

  • ইউজার কে রো কলাম ইনপুট দিতে দাও, এবার কন্ডিশন চেক করো যে নির্ণায়ক আছে কিনা। (রো কলাম সমান না হলে নির্নায়ক হবে না) থাকলে বের করো নাহলে প্রিন্ট করো যে সম্ভব না।

অ্যারে শেষ!

তো এখানে আমরা অ্যারে এর ইতি টানছি। এর পরের পোস্ট হবে মেথড নিয়ে । মানে ফাংশন নিয়ে। ( ফাংশন মেথড দুইটাই সঠিক, OOP তে লোকে মেথড বেশি বলে )।

Imgur

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s