From 7739593bd40285771728bf475c63b01d3a22a065 Mon Sep 17 00:00:00 2001 From: Ashikuzzaman Date: Thu, 3 Nov 2016 03:30:54 +0600 Subject: [PATCH 01/11] Added abstract class concepts --- 5.1.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/5.1.md b/5.1.md index 8515021..00e7d67 100644 --- a/5.1.md +++ b/5.1.md @@ -1,4 +1,4 @@ -## ইনহেরিট্যান্স- +## ইনহেরিট্যান্স- এবার আমরা অবজেক্ট ওরিয়েন্টেড কনসেপ্ট-এর আরও ভেতরে প্রবেশ করবো। শুরুতেই আমরা ইনহেরিটেন্স নিয়ো আলোচনা করি। @@ -214,3 +214,65 @@ A car has an engine ( কার এর একটি ইঞ্জিন আছে জাভা মাল্টিপল ইনহেরিটেন্স সাপোর্ট করে না। এর মানে হচ্ছে আমার একটি ক্লাস শুধুমাত্র একটি ক্লাসকেই ইনহেরিট করতে পারে। + +**অ্যাবস্ট্রাক্ট ক্লাস ( Abstract Class ):** +অ্যাবস্ট্রাক্ট ক্লাস হল বিশেষ এক ধরনের ক্লাস যেটির মাঝে কমপক্ষে একটি অ্যাবস্ট্রাক্ট মেথড থাকবে । তাহলে প্রশ্ন হল অ্যাবস্ট্রাক্ট মেথড আসলে কি জিনিস । অ্যাবস্ট্রাক্ট মেথড হল এমন এক ধরনের মেথড যেটার কোন বডি নেই। সোজা কথায় যে মেথডের অ্যাক্সেস মডিফায়ার আছে, রিটার্ন টাইপ আছে, মেথডের নাম আছে, ইনপুট প্যারামিটার আছে কিন্তু কোন বডি ডিফাইন করা নেই । বডি এম্পটি বা অ্যাবস্ট্রাক্ট সেজন্য এই মেথডকে অ্যাবস্ট্রাক্ট মেথড বলা হয়েছে । চলুন ছোট্ট একটা উদাহরন দেখে পরে ব্যাখ্যার দিকে যাই । + +```java +public abstract class Animal{ + + public abstract String color(); + public void name(){ + System.out.println(“Tiger”); + } +} +``` +উপরোক্ত কোডটিতে `Animal` একটি অ্যাবস্ট্রাক্ট ক্লাস । অ্যাবস্ট্রাক্ট ডিক্লেয়ার করার সময় `class` কিওয়ার্ডের আগে `abstract` কিওয়ার্ডটি লিখতে হবে । অ্যাবস্ট্রাক্ট ক্লাস পাবলিক বা ডিফল্ট যেকোনটিই হতে পারে । এই ক্লাস অ্যাবস্ট্রাক্ট ডিক্লেয়ার করার কারন এর মাঝে আমরা একটি অ্যাবস্ট্রাক্ট মেথড ডিক্লেয়ার করেছি যেটির নাম `color` । সহজেই আমরা বুঝতে পারছি যে অ্যাবস্ট্রাক্ট মেথড ডিক্লেয়ার করতে গেলে তার আগে `abstract` কিওয়ার্ডটি ব্যাবহার করতে হবে । লক্ষ করে দেখুন `color` মেথডের অ্যাক্সেস মডিফায়ার, রিটার্ন টাইপ ( ইনপুট প্যারামিটার দিলে দেওয়া সম্ভব ) সবই আছে কিন্তু কোন বডি নেই । এজন্য এই মেথডকে বলা হয়েছে অ্যাবস্ট্রাক্ট মেথড । একটি অ্যাবস্ট্রাক্ট ক্লাসে যেমন একাধিক অ্যাবস্ট্রাক্ট মেথড থাকতে পারে তেমন সাধারন মেথডও থাকতে পারে প্রচুর পরিমান । প্রশ্ন হল কেন এই অ্যাবস্ট্রাক্ট মেথড ? + +অ্যাবস্ট্রাক্ট ক্লাসের কোন ইন্সট্যান্স ক্রিয়েট করা যায়না যতক্ষন না সবগুলা অ্যাবস্ট্রাক্ট মেথডকে ওভাররাইড করা হচ্ছে । অ্যাবস্ট্রাক্ট মেথড হল একটা রুলের বা নিয়মের মত । এই মেথডের মাধ্যমে বলে দেওয়া হচ্ছে যে , যে ক্লাসই এই `Animal` ক্লাসকে এক্সটেন্ড করবে তাকে অবশ্যই `color` মেথডটি ওভাররাইড করতে হবে এবং নিজস্ব কাজের উপর ভিত্তি করে তাকে । যদি `Animal` ক্লাসকে `Bird` ক্লাস এক্সটেন্ড করে কিন্তু `color` মেথডটি ওভাররাইড না করে তবে `Bird` ক্লাসটিকেও অবশ্যই অ্যাবস্ট্রাক্ট ক্লাস হতে হবে । + +```java +abstract class Animal{ + + abstract void color(); +} + +abstract class Bird extends Animal{ + //abstract void color(); is present by default +} + +class Crow extends Animal{ + + @Override + void color() { + System.out.println("Black"); + } +} +public class Main { + + public static void main(String[] args) { + + Animal animal = new Crow(); + animal.color(); + Crow bird = new Crow(); + bird.color(); + } +} +``` + +উপরোক্ত কোডটিতে আমরা `Bird` ক্লাসের অবজেক্ট কোনভাবেই ক্রিয়েট করতে পারবো না যতক্ষন পর্যন্ত না আমরা এর সব অ্যাবস্ট্রাক্ট মেথড ইম্প্লিমেন্ট করছি । সে কাজটি করা সম্ভব এই ক্লাসটিকে যদি অন্য কোন ক্লাস এক্সটেন্ড করে এবং সব অ্যাবস্ট্রাক্ট মেথড ইম্লিমেন্ট করে অথবা অবজেক্ট ক্রিয়েট করার সময় আমরা সব অ্যাবস্ট্রাক্ট মেথড ইমপ্লিমেন্ট করে দেই । প্রথম কাজটি আপনারা পারেন । এখানে ২য় উপায়টি দেখানো হলঃ +```java +public class Main { + + public static void main(String[] args) { + + Bird bird = new Bird() { + @Override + void color() { + System.out.println("White"); + } + }; + bird.color(); + } +} +``` From fd492922feb260f89872349ee1cb386b15b163d2 Mon Sep 17 00:00:00 2001 From: Ashikuzzaman Date: Thu, 3 Nov 2016 04:00:59 +0600 Subject: [PATCH 02/11] Added interface concepts in 5.1.md file --- 5.1.md | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/5.1.md b/5.1.md index 00e7d67..10388cd 100644 --- a/5.1.md +++ b/5.1.md @@ -241,7 +241,7 @@ abstract class Bird extends Animal{ //abstract void color(); is present by default } -class Crow extends Animal{ +class Crow extends Bird{ @Override void color() { @@ -252,8 +252,8 @@ public class Main { public static void main(String[] args) { - Animal animal = new Crow(); - animal.color(); + //Animal animal = new Animal(); //This is not possible + //Bird animal = new Bird(); //This is not possible Crow bird = new Crow(); bird.color(); } @@ -276,3 +276,49 @@ public class Main { } } ``` + + +**ইন্টারফেস ( Interface ):** +ইনহেরিট্যান্সের খুব গুরুত্বপূর্ন এবং কার্যকরী একটি টার্মস হল ইন্টারফেস । ইন্টারফেস ডিক্লেয়ার করতে হয় `interface` কিওয়ার্ডটি দিয়ে । এটি `public` বা ডিফল্ট যেকোনটিই হতে পারে ক্লাসের মত । আমরা ইতোমধ্যে জেনে ফেলেছি `Abstract` ক্লাস এবং অ্যাবস্ট্রাক্ট মেথড কি জিনিস । অ্যাবস্ট্রাক্ট ক্লাস এবং মেথড বুঝে থাকলে ইন্টারফেস বুঝতে পারা খুব বেশি কঠিন কিছুই নয় । ইন্টারফেস এমন একটি ক্লাস যেখানে সবগুলা মেথডই অ্যাবস্ট্রাক্ট । অর্থাৎ ১০০% অ্যাবস্ট্রাক্ট ক্লাসকে ইন্টারফেস বলা যায় । অ্যাবস্ট্রাক্ট ক্লাসে অ্যাবস্ট্রাক্ট মেথড এবং রেগুলার মেথড দুটিই ছিল কিন্তু ইন্টারফেসে কোন প্রকার রেগুলার মেথড থাকবে না । ইন্টারফেসে কেবল অ্যাবস্ট্রাক্ট মেথডই থাকবে । চলুন আমরা একটি উদাহরন দেখে নেইঃ + +```java +interface Animal{ + + public abstract void name(String animalName); + String color(); +} + +interface Cow{ + void work(); +} + +public class Main implements Animal, Cow{ + + public static void main(String[] args) { + + Main m = new Main(); + m.name("I don't know this :P"); + System.out.println(m.color()); + m.work(); + } + + @Override + public void name(String animalName) { + System.out.println(animalName); + } + + @Override + public String color() { + return "Red"; + } + + @Override + public void work() { + System.out.println("Gives Milk"); + } +} +``` +লক্ষ করুন এখানে `interface` কিওয়ার্ডটি দিয়ে দুটি ইন্টারফেস ডিক্লেয়ার করা হয়েছে যথাক্রমে `Animal` এবং `Cow` । `Animal` ইন্টারফেসের মধ্য দুটি মেথড আছে যাদের একজনে `public` এবং `abstract` ডিক্লেয়ার করা হয়েছে কিন্তু অন্য মেথডটি কেবল রিটার্নটাইপ দেওয়া হয়েছে । এটির কারন হল ইন্টারফেসের মাঝে আপনি যদি কোন মেথডের পূর্বে `public` এবং `abstract` ডিক্লেয়ার নাও করেন তবু তারা বাই ডিফল্ট পাবলিক এবং অ্যাবস্ট্রাক্ট । +এবার আসি `Main` ক্লাসে । এতক্ষন আমরা যেনে এসেছি যে জাভা মাল্টিপল ইনহেরিট্যান্স সাপোর্ট করেনা তাহলে এখানে কেন দুটি ইন্টারফেস ইম্লিমেন্ট করছে ? হ্যা সেটাই করবে কারন পরে ব্যাখ্যা করা হবে । এখানে লক্ষনীয় বিষয় হল ইন্টারফেসকে কিন্তু `implements` কিওয়ার্ড দিয়ে ইমপ্লিমেন্ট করতে হয় । এখানে কিন্তু এক্সটেন্ড হবেনা । একটি ক্লাস কেবল অন্য একটি ক্লাসকে এক্সটেন্ড করতে পারবে তবে একই সাথে অন্য শুন্য , এক বা একাধিক ইন্টারফেসকেও ইমপ্লিমেন্ট করতে পারবে । একাধিক ইন্টারফেস ইমপ্লিমেন্ট করার প্রয়োজন হলে কমা ( , ) দিয়ে একটির পর আরেকটি যোগ করতে হবে । তবে অবশ্যই অ্যাবস্ট্রাক্ট মেথড ইমপ্লিমেন্ট করতে ভুলবেন না । :P + +উল্লেখ্য অ্যাবস্ট্রাক্ট মেথডের মত ইন্টারফেসেরও কোন অবজেক্ট ক্রিয়েট করা যায়না । যায়না সেটা বলা ভুল তবে সরাসরি যায়না । কিভাবে যায় সেটা বোঝার জন্য আপনাদের পলিমরফিজম পর্যন্ত যাওয়া লাগবে । ;) From 01dc54e1bb2b85e307aebf9fdf05e7be6d357260 Mon Sep 17 00:00:00 2001 From: "Md. Ashikuzzaman" Date: Thu, 3 Nov 2016 04:04:13 +0600 Subject: [PATCH 03/11] Update 5.1.md --- 5.1.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/5.1.md b/5.1.md index 10388cd..d5cee14 100644 --- a/5.1.md +++ b/5.1.md @@ -216,6 +216,7 @@ A car has an engine ( কার এর একটি ইঞ্জিন আছে **অ্যাবস্ট্রাক্ট ক্লাস ( Abstract Class ):** + অ্যাবস্ট্রাক্ট ক্লাস হল বিশেষ এক ধরনের ক্লাস যেটির মাঝে কমপক্ষে একটি অ্যাবস্ট্রাক্ট মেথড থাকবে । তাহলে প্রশ্ন হল অ্যাবস্ট্রাক্ট মেথড আসলে কি জিনিস । অ্যাবস্ট্রাক্ট মেথড হল এমন এক ধরনের মেথড যেটার কোন বডি নেই। সোজা কথায় যে মেথডের অ্যাক্সেস মডিফায়ার আছে, রিটার্ন টাইপ আছে, মেথডের নাম আছে, ইনপুট প্যারামিটার আছে কিন্তু কোন বডি ডিফাইন করা নেই । বডি এম্পটি বা অ্যাবস্ট্রাক্ট সেজন্য এই মেথডকে অ্যাবস্ট্রাক্ট মেথড বলা হয়েছে । চলুন ছোট্ট একটা উদাহরন দেখে পরে ব্যাখ্যার দিকে যাই । ```java @@ -279,6 +280,7 @@ public class Main { **ইন্টারফেস ( Interface ):** + ইনহেরিট্যান্সের খুব গুরুত্বপূর্ন এবং কার্যকরী একটি টার্মস হল ইন্টারফেস । ইন্টারফেস ডিক্লেয়ার করতে হয় `interface` কিওয়ার্ডটি দিয়ে । এটি `public` বা ডিফল্ট যেকোনটিই হতে পারে ক্লাসের মত । আমরা ইতোমধ্যে জেনে ফেলেছি `Abstract` ক্লাস এবং অ্যাবস্ট্রাক্ট মেথড কি জিনিস । অ্যাবস্ট্রাক্ট ক্লাস এবং মেথড বুঝে থাকলে ইন্টারফেস বুঝতে পারা খুব বেশি কঠিন কিছুই নয় । ইন্টারফেস এমন একটি ক্লাস যেখানে সবগুলা মেথডই অ্যাবস্ট্রাক্ট । অর্থাৎ ১০০% অ্যাবস্ট্রাক্ট ক্লাসকে ইন্টারফেস বলা যায় । অ্যাবস্ট্রাক্ট ক্লাসে অ্যাবস্ট্রাক্ট মেথড এবং রেগুলার মেথড দুটিই ছিল কিন্তু ইন্টারফেসে কোন প্রকার রেগুলার মেথড থাকবে না । ইন্টারফেসে কেবল অ্যাবস্ট্রাক্ট মেথডই থাকবে । চলুন আমরা একটি উদাহরন দেখে নেইঃ ```java From bf875bd7e2cbdf183b027e260a746aea59fb8c33 Mon Sep 17 00:00:00 2001 From: Ashikuzzaman Date: Thu, 3 Nov 2016 04:15:47 +0600 Subject: [PATCH 04/11] Added some rules for Inheriting interface and abstract class in 5.1.md file --- 5.1.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/5.1.md b/5.1.md index d5cee14..126d52b 100644 --- a/5.1.md +++ b/5.1.md @@ -323,4 +323,10 @@ public class Main implements Animal, Cow{ লক্ষ করুন এখানে `interface` কিওয়ার্ডটি দিয়ে দুটি ইন্টারফেস ডিক্লেয়ার করা হয়েছে যথাক্রমে `Animal` এবং `Cow` । `Animal` ইন্টারফেসের মধ্য দুটি মেথড আছে যাদের একজনে `public` এবং `abstract` ডিক্লেয়ার করা হয়েছে কিন্তু অন্য মেথডটি কেবল রিটার্নটাইপ দেওয়া হয়েছে । এটির কারন হল ইন্টারফেসের মাঝে আপনি যদি কোন মেথডের পূর্বে `public` এবং `abstract` ডিক্লেয়ার নাও করেন তবু তারা বাই ডিফল্ট পাবলিক এবং অ্যাবস্ট্রাক্ট । এবার আসি `Main` ক্লাসে । এতক্ষন আমরা যেনে এসেছি যে জাভা মাল্টিপল ইনহেরিট্যান্স সাপোর্ট করেনা তাহলে এখানে কেন দুটি ইন্টারফেস ইম্লিমেন্ট করছে ? হ্যা সেটাই করবে কারন পরে ব্যাখ্যা করা হবে । এখানে লক্ষনীয় বিষয় হল ইন্টারফেসকে কিন্তু `implements` কিওয়ার্ড দিয়ে ইমপ্লিমেন্ট করতে হয় । এখানে কিন্তু এক্সটেন্ড হবেনা । একটি ক্লাস কেবল অন্য একটি ক্লাসকে এক্সটেন্ড করতে পারবে তবে একই সাথে অন্য শুন্য , এক বা একাধিক ইন্টারফেসকেও ইমপ্লিমেন্ট করতে পারবে । একাধিক ইন্টারফেস ইমপ্লিমেন্ট করার প্রয়োজন হলে কমা ( , ) দিয়ে একটির পর আরেকটি যোগ করতে হবে । তবে অবশ্যই অ্যাবস্ট্রাক্ট মেথড ইমপ্লিমেন্ট করতে ভুলবেন না । :P +কয়েকটি বিষয় জেনে রাখা ভালোঃ + +১) একটি ক্লাস একটি মাত্র ক্লাস বা অ্যাবস্ট্রাক্ট ক্লাসকে এক্সটেন্ড করতে পারবে । +২) একটি ক্লাস বা অ্যাবস্ট্রাক্ট ক্লাস এক বা একাধিক ইন্টারফেসকে ইমপ্লিমেন্ট করতে পারবে । +৩) একটি ইন্টারফেস এক বা একাধিক ইন্টারফেসকে এক্সটেন্ড (ইমপ্লিমেন্ট নয় কিন্তু) করতে পারবে । + উল্লেখ্য অ্যাবস্ট্রাক্ট মেথডের মত ইন্টারফেসেরও কোন অবজেক্ট ক্রিয়েট করা যায়না । যায়না সেটা বলা ভুল তবে সরাসরি যায়না । কিভাবে যায় সেটা বোঝার জন্য আপনাদের পলিমরফিজম পর্যন্ত যাওয়া লাগবে । ;) From 023fb48ff30f1e9240b770e5fb9a3721f27e3bc7 Mon Sep 17 00:00:00 2001 From: Ashikuzzaman Date: Thu, 3 Nov 2016 04:23:48 +0600 Subject: [PATCH 05/11] Added definition of polymorphism in 5.2.md file --- 5.2.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/5.2.md b/5.2.md index 8598d8a..3b7fb8e 100644 --- a/5.2.md +++ b/5.2.md @@ -1,7 +1,9 @@ -## পলিমরফিজম (Polymorphism) +## পলিমরফিজম (Polymorphism) এবার আমরা কথা বলবো পলিমরফিজম নিয়ে। শব্দটির মধ্যেই একটি বিশেষ গাম্ভীর্য আছে যা কিনা একটি সাধারণ কথোপকথনকে অনেক গুরুত্বর্পূণ করে তুলতে পারে। তবে এটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর একটি বহুল ব্যবহৃত কৌশল । এই শব্দটির সহজ মানে হচ্ছে যার একাধিক রূপ আছে অর্থাৎ বহুরূপিতা। +সহজ কথায় পলিমরফিজম হল এমন একটি টেকনিক বা পদ্ধতি যেখানে আমরা একটি ক্লাস, অ্যাবস্ট্রাক্ট ক্লাস বা ইন্টারফেসের অবজেক্ট ক্রিয়েট করি তার চাইল্ড ক্লাসের কনস্ট্রাক্টরের মাধ্যমে । অর্থাৎ আমরা একটি ক্লাসের অবজেক্ট ক্রিয়েট করবো অন্য একটি ক্লাসের কনস্ট্রাক্টর কল করে । সহজ ভাষায় এটিই হল পলিমরফিজম । + মনে করা যাক, ‌‌ ‌ @@ -146,4 +148,4 @@ -## চলবে ..... \ No newline at end of file +## চলবে ..... From 07d38613fcf7c02cc095a38c975102bdba8ff331 Mon Sep 17 00:00:00 2001 From: Ashikuzzaman Date: Thu, 3 Nov 2016 05:41:43 +0600 Subject: [PATCH 06/11] Added Homogeneous and Heterogeneous Collection of polymorphism in 5.2.md file --- 5.2.md | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/5.2.md b/5.2.md index 3b7fb8e..17ea093 100644 --- a/5.2.md +++ b/5.2.md @@ -146,6 +146,137 @@ +**হোমেজিনিয়াস কালেকশন ( Homogeneous Collection ):** + +হোমোজিনিয়াস কালেকশন হল একই ক্লাসের কিছু সংখ্যক অবজেক্টের কালেকশন । একটি উদাহরন দিয়ে বিষয়টি একটু সুরাহা করা যাকঃ + +```java +interface Animal { + + public abstract void name(String animalName); +} + +class Cow implements Animal { + + private String animalName; + + public void work(String animalWork) { + System.out.println("Work of " + this.animalName + " is " + animalWork); + } + + @Override + public void name(String animalName) { + this.animalName = animalName; + System.out.println("Name of the animal is: " + this.animalName); + } +} + +public class Main { + + public static void main(String[] args) { + + Animal[] collection1 = new Cow[3]; + collection1[0] = new Cow(); + collection1[1] = new Cow(); + collection1[2] = new Cow(); + + Cow[] collection2 = new Cow[3]; + collection2[0] = new Cow(); + collection2[1] = new Cow(); + collection2[2] = new Cow(); + } +} +``` + +লক্ষ করুন । এখানে `Cow` ক্লাসটি `Animal` ইন্টারফেসের চাইল্ড । এবং `Main` ক্লাসের `main` মেথড এর মাঝে ২ টি অবজেক্টের অ্যারে ডিক্লেয়ার করা হয়েছে । একটি `Animal` ক্লাসের অবজেক্টের অ্যারে যেটির সবগুলা অবজেক্ট `Cow` ক্লাসের কনস্ট্রাক্টর দিয়ে ইন্সট্যানশিয়েট করা হয়েছে । এখানে পলিমরফিজম স্পষ্ট । এবং অন্যটি অবজেক্ট অ্যারেটি চীরাচরিত অবজেক্ট অ্যারে । এই দুইি অ্যারেই হল হোমোজিনিয়াস কালেকশনের উদাহরন । বোঝা যায়নি ? ওকে, এখানে ` collection1` অ্যারেটির প্রতিটি অবজেক্টই `Cow` ক্লাসের কনস্ট্রাক্টর দিয়ে ইন্সট্যানশিয়েট করা হয়েছে । তার মানে `collection1` এর মাঝে সবগুলা অবজেক্টই একই ধরনের । যেহেতু এই অ্যারেটির সবগুলা এলিমেন্ট একই ধরনের/ক্লাসের অবজেক্ট সুতরাং এটিকে বলা হবে হোমোজিনিয়াস কালেকশন । একই কথা `collection2` এর ক্ষেত্রেও প্রোযোজ্য । + + +**হেটারোজিনিয়াস কালেকশন ( Heterogeneous Collection ):** + +ভিন্নধর্মী অবজেক্টের কালেকশনকেই বলা হয় হেটারোজিনিয়াস কালেকশন । হেটারোজিনিয়াস কালেকশন বুঝতে হলে আমাদের একটি উদাহরন দেখে নেওয়া উত্তমঃ + +```java +class Animal { + + String animalName ; + public Animal(String animalName){ + this.animalName = animalName; + } + public void name(){ + System.out.println("Animal name is: "+this.animalName); + } +} + +class Cow extends Animal { + + public Cow(String animalName) { + super(animalName); + } + + public void work(String animalWork) { + System.out.println("Work of " + this.animalName + " is " + animalWork); + } +} + +class Dog extends Animal { + + public Dog(String animalName) { + super(animalName); + } + + public void work(String animalWork) { + System.out.println("Work of " + this.animalName + " is " + animalWork); + } +} + +class Cat extends Animal { + + public Cat(String animalName) { + super(animalName); + } + + public void work(String animalWork) { + System.out.println("Work of " + this.animalName + " is " + animalWork); + } +} + +public class Main { + + public static void main(String[] args) { + + Animal[] animals = new Animal[4]; + animals[0] = new Animal("Dolphin"); + animals[1] = new Cow("Big Cow"); + animals[2] = new Dog("Red Dog"); + animals[3] = new Cat("White Cat"); + } +} +``` + +খুব ভালোভাবে লক্ষ করুন । আমরা `Animal` ক্লাসের অবজেক্টের একটু অ্যারে ডিক্লেয়ার করেছি যার সাইজ ৪ । কিন্তু ইন্সট্যানশিয়েট করার সমস আমরা পলিমরফিজম মেকানিজম ব্যাবহার করে এর চাইল্ড ক্লাসের ভিন্ন ভিন্ন কনস্ট্রাক্টর দিয়ে ইন্সট্যানশিয়েট করেছি । অর্থাৎ `animals` অ্যারেটির প্রতিটি অবজেক্টই আলাদা আলাদা কনস্ট্রাক্ট দিয়ে ইন্সট্যানশিয়েট করা এবং তাদের বিহ্যাভিয়েরাল পার্থ্য আছে । এধরনের কালেকশনকে বলা হয় হেটারোজিনিয়াস কালেকশন । + +এবার একটু ভিন্ন পন্থায় এগোন যাক । মেইন ক্লাসটিকে আমরা একটু মডিফাই করবো । বাকী সবই ঠিক থাকবে আগের মত । + +```java +public class Main { + + public static void main(String[] args) { + + Animal animal = new Cat("Cute Cat"); + animal.name(); + //animal.work("Some Work");//Not possible + Cat cat = new Cat("Preety Cat"); + cat.name(); + cat.work("It plays"); + } +} +``` + +খেয়াল করে দেখুন আমরা `Animal` এবং `Cat` এর অবজেক্ট ক্রিয়েট করার সময় কনস্ট্রাক্টর ব্যাবহার করেছি `Cat` এর কিন্তু `Animal` এর অবজেক্ট থেকে আমরা `work` মেথডটি কোন ভাবেই কল করতে পারছি না বা পারবো না কিন্তু `Cat` এর অবজেক্ট থেকে ঠিকই পারছি । কারনটা কি ? কারন হল `Animal` ক্লাসের মাঝে ঠিক যে যে মেথড আছে সেগুলাকেই আমরা অ্যাক্সেস করতে পারব তবে `Cat` এর ইমপ্লিমেন্টেশন দিয়ে । `Animal` এর মাঝে নেই কিন্তু `Cat` ক্লাসে বাড়তি আছে এমন কোন মেথডকে আমরা অ্যাক্সেস করতে পারবো না । এমনকি `Animal` ক্লাসের অবজেক্টে `Cat` ক্লাসের `work` মেথডের কোন রেফারেন্সই ক্রিয়েট হবেনা । + +তাহলে এটা করি কেন আমরা ? এটা করার পেছনে বেশ কিছু কারন থাকতে পারে । প্রথমত আমরা প্যারেন্ট ক্লাস এবং চাইল্ড ক্লাসের ইমপ্লিমেন্টশন নিয়ে কাজ করতে চাইলে পলিমরফিজমের এই সুবিধাটি নেওয়া হয় । অন্য কারনটি হল মেমোরি কনজাম্পশন । ভেবে দেখুন যদি `Animal` ক্লাসে ৩ টি মেথড থাকে যেগুলার জন্য আপনি `Cat` ক্লাসের ইমপ্লিমেন্টেশন ব্যাবহার করতে চান , কিন্তু `Cat` ক্লাসের মাঝে ১৫ টির মত মেথড আছে এবং অনেক অ্যাট্রিবিউট । আপনি যদি `Cat` এর অবজেক্ট ক্রিয়েট করেন তবে মেমোরি থেকে প্রচুর স্পেস কনজিউম করবে উক্ত অবজেক্ট । অন্যদিকে আপনি যদি `Animal` এর অবজেক্ট ক্রিয়েট করেন `Cat` এর কনস্ট্রাক্টর ব্যাবহার করে তাহলে `Cat` ক্লাসের ইমপ্লিমেন্টেশন ব্যাবহার করতে পারছেন এবং মেমোরি থেকে খুব কম মেমোরি কনজিউম করছে ( `Animal` মেথডগুলার জন্য প্রয়োজনীয় মোমোরি মাত্র ) । +কোনটি বেশি সুবিধাজনক ? এছাড়া আরো কারন আছে । পরবর্তীতে সেগুলা নিয়েও আলোচনা করা হবে । + ## চলবে ..... From 0a722af780516576f1bf96b30cbc137fb5c18da1 Mon Sep 17 00:00:00 2001 From: Ashikuzzaman Date: Thu, 3 Nov 2016 06:40:36 +0600 Subject: [PATCH 07/11] Added Invoking Constructor Overriding concepts in 5.1.md file --- 5.1.md | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/5.1.md b/5.1.md index 126d52b..c1dd9a6 100644 --- a/5.1.md +++ b/5.1.md @@ -215,6 +215,75 @@ A car has an engine ( কার এর একটি ইঞ্জিন আছে জাভা মাল্টিপল ইনহেরিটেন্স সাপোর্ট করে না। এর মানে হচ্ছে আমার একটি ক্লাস শুধুমাত্র একটি ক্লাসকেই ইনহেরিট করতে পারে। + +**কনস্ট্রাক্টর অভাররাইডিং(Constructor Overriding)** + +মেথডের মত কনস্ট্রাকটরও অভাররাইড এবং ওভারলোড (Overload) করা যায় । অভাররাইড করা যায় বলতে অনেক ক্ষেত্রে কনস্ট্রাকটর অভাররাইড ম্যান্ডেটরি । প্যারেন্ট ক্যালে যদি এমন কোন কনস্ট্রাক্টর থাকে যেটি প্রাইভেট নয় এবং যেটি এক বা একাধিক ইনপুট প্যারামিটার নিয়ে থাকে তবে চাইল্ড ক্লাসে অবশ্যই সেই কনস্ট্রাক্টর অবশ্যই অভাররাইড করতে হবে । এটা বাধ্যতামূলক । একটা ছোট্ট উদাহরন দিয়ে বিষয়টি আমরা পরিষ্কার করে নিতে পারি । + +```java +class Animal { + + String animalName ; + String animalColor ; + + public Animal(String animalName, String animalColor){ + + this.animalName = animalName; + this.animalColor = animalColor; + } + + public void showName(){ + System.out.println("Animal Name is: "+this.animalName); + } + public void showColor(){ + System.out.println("Animal Color is: "+this.animalColor); + } +} + +class Cow extends Animal{ + + private String work ; + public Cow(String animalName, String animalColor) { +// this.work = "No Work";//This is not valid + super(animalName, animalColor);//super in constructor have to be on top + this.work = "Gives Milk";//This is valid + } + + @Override + public void showColor() { + System.out.println("Before showColor in child"); + super.showColor(); + } + + @Override + public void showName() { + super.showName(); + System.out.println("After showName in child"); + } + public void showDescription(){ + this.showName(); + System.out.println("Animal Work is: "+this.work); + this.showColor(); + } +} + + +public class Main { + + public static void main(String[] args) { + + Cow cow = new Cow("White Cow", "White"); + cow.showDescription(); + } +} +``` + +উপরের কোডটি মন দিয়ে লক্ষ করুন । প্যারেন্ট ক্লাস `Animal` এর মাঝে একটি পাবলিক কনস্ট্রাক্ট আছে যেটি দুটি প্যারামিটার নিয়ে থাকে । তাই এটার চাইল্ড ক্লাসেও আমাদের অবশ্যই একটি কনস্ট্রাক্টর থাকতে হবে যেটির মাঝে প্যারেন্ট ক্লাসের ওই কনস্ট্রাকটর ইনভোক করতে হবে । এটা ম্যান্ডেটরি । এটি না করলে কোড কম্পাইলেশন এরর শো করবে এবং কম্পাইলই হবেনা । আরো একটি বিষয় চাইল্ড ক্লাসের কনস্ট্রাক্টরের মাঝ থেকে প্যারেন্ট ক্লাসের কনস্ট্রাক্টরকে `super` কিয়াওর্ড দিয়ে কল করতে হবে তবে , `super` কিয়াওর্ড অবশ্যই সবার উপর থাকতে হবে । এমনকি একটি প্রিন্ট স্টেটমেন্টও থাকতে পারবে না । `super` এর পর যা খুশি থাকতে পারে কোন সমস্যা নাই । এছাড়া অন্য একাধিক কনস্ট্রাক্টর ডিক্লেয়ার করার প্রয়োজন হলে সেটাও করতে পারবেন , এটাকে বলা হবে কনস্ট্রাক্টর ওভারলোডিং । যথারীতি এর মাঝেও `super` বাবাজি অধিপত্য বিরাজ করে বসে থাকবে । + +তবে মেথড আর কনস্ট্রাক্টরের ওভাররাইডিং এর মাঝে এটা বড় একটা পার্থক্য যে মেথডের ক্ষেত্রে সুপার আপনারা কাজের সুবিধার জন্য যেকোন যায়গার ব্যাবহার করতে পারবেন । তবে কনস্ট্রাক্টরের ক্ষেতে আঈন খুবই কঠিন । + + + **অ্যাবস্ট্রাক্ট ক্লাস ( Abstract Class ):** অ্যাবস্ট্রাক্ট ক্লাস হল বিশেষ এক ধরনের ক্লাস যেটির মাঝে কমপক্ষে একটি অ্যাবস্ট্রাক্ট মেথড থাকবে । তাহলে প্রশ্ন হল অ্যাবস্ট্রাক্ট মেথড আসলে কি জিনিস । অ্যাবস্ট্রাক্ট মেথড হল এমন এক ধরনের মেথড যেটার কোন বডি নেই। সোজা কথায় যে মেথডের অ্যাক্সেস মডিফায়ার আছে, রিটার্ন টাইপ আছে, মেথডের নাম আছে, ইনপুট প্যারামিটার আছে কিন্তু কোন বডি ডিফাইন করা নেই । বডি এম্পটি বা অ্যাবস্ট্রাক্ট সেজন্য এই মেথডকে অ্যাবস্ট্রাক্ট মেথড বলা হয়েছে । চলুন ছোট্ট একটা উদাহরন দেখে পরে ব্যাখ্যার দিকে যাই । From 78f174d2e4620da9be684d162f04ed73716ed2b1 Mon Sep 17 00:00:00 2001 From: Ashikuzzaman Date: Thu, 3 Nov 2016 07:27:14 +0600 Subject: [PATCH 08/11] Added Overloading of method and constructor in 5.1.md file --- 5.1.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/5.1.md b/5.1.md index c1dd9a6..8077879 100644 --- a/5.1.md +++ b/5.1.md @@ -283,6 +283,85 @@ public class Main { তবে মেথড আর কনস্ট্রাক্টরের ওভাররাইডিং এর মাঝে এটা বড় একটা পার্থক্য যে মেথডের ক্ষেত্রে সুপার আপনারা কাজের সুবিধার জন্য যেকোন যায়গার ব্যাবহার করতে পারবেন । তবে কনস্ট্রাক্টরের ক্ষেতে আঈন খুবই কঠিন । +**অভারলোডিং অফ মেথড & কনস্ট্রাক্টর ( Overloading of method and constructor ):** + +অভারলোডিং বলতে খুব সাধারন ভাষায় বোঝায় একই নামের এবং একই রিটার্ন টাইপের ( নাও হতে পারে ) একাধিক মেথড বা কনস্ট্রাক্টর ( এক্ষেত্রে কোন রিটার্ন টাইপ থাকবে না ) বিদ্যমান থাকা । তার অর্থ দাড়ালো একই ক্লাসের মাঝে একই নামের এবং রিটার্ন টাইপের একাধিক মেথড বা কনস্ট্রাক্টর বিদ্যমান থাকবে । বিষয়টা একটু গোলমেলে মনে হচ্ছে তাইনা ? আসলে তেমন কিছুই নয় , বরং বিষয়টি অন্য অনেক কিছুর থেকেও অনেক বেশি সরল । একই নামের মেথড বা কনস্ট্রাক্ট থাকলেও তাদের ইনপুট প্যারামিটার কিন্তু একই হবেনা । ইনপুট টাইপ হয়ত ভিন্ন টাইপের হবে নাহয় একটি মেথড থেকে অন্যা মেথডের ইনপুট প্যারামিটার সংখ্যা ভিন্ন হবে । উদাহরন সহকারে আমরা আমাদের কনফিউশন দুর করতে পারি । চলুন একটি উদাহরন দেখে নেওয়া যাকঃ + +```java +public class Main { + + private int initialNumber; + private int terminalNumber; + + public Main(int initialNumber, int terminalNumber) { + + this.initialNumber = initialNumber; + this.terminalNumber = terminalNumber; + } + + public Main(int terminalNumber) { + + this(0, terminalNumber); + } + + public Main() { + + this(0, 100); + } + + public void showNumbers() { + + System.out.println("First Number: " + this.initialNumber + ", Second Number: " + this.terminalNumber); + } + + public static void main(String[] args) { + + Main m = new Main(1, 5); + m.showNumbers(); + Main m2 = new Main(5); + m2.showNumbers(); + Main m3 = new Main(); + m3.showNumbers(); + } +} +``` +উপরের কোড সেগমেন্টটিতে আরা দেখতে পারছি যে একই `Main` ক্লাসে একই নামের কনস্ট্রাক্টর ৩ টি । খেয়াল করলে দেখা যাবে যে ৩ টি কনস্ট্রাক্টর প্রায় একই কাজ করলেও তাদের ইনপুট প্যারামিটার কিন্তু একই নয় । একেক জন একেক রকম ইনপুট নিয়ে কাজ করছে । এভাবে একই ক্লাসের মাঝে একাধিক কাজের জন্য একাধিক কনস্ট্রাক্টর ব্যাবহার করাকে বলাহয় কনস্ট্রাক্টর অভারলোডিং । যেখানে একই কনস্ট্রাক্টরের লোড অভার হয়ে গিয়েছে :P + + +ওকে, এবার আসা যাক মেথড অভারলোডিং বিষয়ে । কনস্ট্রাক্টরের মত মেথড অভারলোডিংও সেম ম্যাকানিজম ফলো করে । একটি উদাহরন দিলেই বিষয়টি পরিষ্কার হয়ে যাবেঃ + +```java +public class Main { + + private int sum(int a, int b){ + return a+b; + } + private int sum(int a, int b, int c){ + return a+b+c; + } + private int sum(int ... a){ + + int result = 0; + for(int x : a){ + result+=x; + } + return result; + } + + public static void main(String[] args) { + + Main m = new Main(); + System.out.println(m.sum(3, 5)); + System.out.println(m.sum(3, 5, 7)); + System.out.println(m.sum(3, 5, 7, 17)); + System.out.println(m.sum(3, 5, 7, 17, 23)); + } +} +``` +উপরোক্ত কোডটিতে দেখুন `sum` মেথডটি ৩ বার লেখা হয়েছে । মেথডের আইডেন্টিফায়ার, রিটার্ন টাইপ সবই ঠিক আছে তবু কাজ করছে ! হ্যা কারন আপনার ইনপুর প্যারামিটার ভিন্ন দিয়েছি । প্রথম `sum` মেথড কেবল ২ টি নাম্বারের যোগ করে দিতে পারে । দ্বিতীয়টি পারে ৩ টি নাম্বারের , আর শেষেরটি পারে যত সংখ্যক ইন্টিজার নাম্বারই দেওয়া হোক না কেন সে যোগ করে রেজাল্ট দিবে । সিম্পলি এটাকেই বলা হয় মেথড ওভারলোডিং । যেখানে একই নামের একাধিক মেথড থাকে যাদের নাম এক হলেও ইনপুট প্যারামিটার বা কাজের ধরন সম্পূর্ন আলাদা হয় । + + + **অ্যাবস্ট্রাক্ট ক্লাস ( Abstract Class ):** From 1aa898938bc3985f033b75c85e5e3b85a3074107 Mon Sep 17 00:00:00 2001 From: Ashikuzzaman Date: Thu, 3 Nov 2016 12:02:30 +0600 Subject: [PATCH 09/11] Added introduction of Collection Frameworks, Advantages and Collections family tree --- 11.md | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/11.md b/11.md index 3ab4804..1348ad8 100644 --- a/11.md +++ b/11.md @@ -1,4 +1,4 @@ -# পাঠ ১১: জাভা কালেকশান ফ্রেমওয়ার্ক +# পাঠ ১১: জাভা কালেকশান ফ্রেমওয়ার্ক * জাভা কালেকশান ফ্রেমওয়ার ভুমিকা * কালেকশান ইন্টারফেইস @@ -15,3 +15,55 @@ * hashCode() এবং equals() * সারসংক্ষেপ + +**কালেকশান ফ্রেমওয়ার্ক** + +কালেকশন ফ্রেমওয়ার্ক জাভার টপ লেভের একটি এপিআই কনসেপ্ট । কালেকশান ফ্রেমওয়ার্ক কিছু হাইলি অপটিমাইজড ডাটা স্ট্রাকচার যার মাধ্যমে বিভিন্ন ডাটা মেমোরিতে স্টোর করতে পারি এবং প্রয়োজন মত ব্যাবহার করতে পারি । মনে করুন অ্যারে নিয়ে কাজ করছেন । কোন একটি সময়ে মনে হল আপনার অ্যারের সাইজ যথেষ্ঠ নয় আপনার কাজের জন্য তখন কি করবেন ? মনে করুন আপনি লিংকড লিস্ট নিয়ে কাজ করছেন কোন একটা সময়ে একটা এলিমেন্ট সার্চ করার প্রয়োজন হলো , সার্চ করলেন । দেখা গেল অনেক্ষন পর রেজাল্ট জানালো যে সেই এলিমেন্ট ওই লিস্টেই নাই । এরকম নানা রকম সমস্যা এবং তার সমাধান নিয়ে যে সব ডাটা স্ট্রাকচার একত্রিত করা হয়েছে সেগুলাকেই একত্রে বলা হয় কালেকশান । কালেকশান মানে হল সমষ্টি । এটি এমন কিছু ডাটা স্ট্রাকচারের সমষ্টি যেগুলার প্রতিটিই বিভিন্ন ডাটাকে সমষ্টিত করে রাখে । হ্যা অ্যারেকেও লো লেভেল এক প্রকার কালেকশান বলা যেতে পারে তবে মডার্ন কালেকশন ফ্রেমওয়ার্কের মাঝে এটিকে ধরা হয়না । + + +**কালেকশান ইন্টারফেস (Collection Interface)** + +ইন্টারফেস কি সেটি আপনারা খুব ভালোভাবেই জানেন । যদি না যেনে থাকেন তবে চ্যাপটার ৫.১ পড়ে আসুন । কালেকশান একটি ইন্টারফেস । যেই ইন্টারফেসের মধ্য বলে দেওয়া হয়েছে কোন একটি ক্লাসকে কালেকশান ফ্রেমওয়ার্কের অন্তর্গত হতে গেলে কি কি বৈশিষ্ট থাকতেই হবে । কালেশনগুলা সাধারনত `java.util` প্যকেজের অন্তর্গত । + +সবার আগে আমাদের জানা প্রয়োজন কেনই বা আমরা কালেকশনস নিয়ে কাজ করবো ? এটি না নিয়েও তো কাজ করা যেতো । তাহলে কালেকশন কেন ! + +ওয়েল , আপনাদের কিছুটা উত্তর আমি আগেই দিয়ে দিয়েছি । + +১)অ্যারে নিয়ে কাজ করার সময় আপনি ফিক্সড লেন্থের বাইরে কাজ করতে পারতেন না । অ্যারের বাউন্ডারি ফিক্সড এবং এটি বাড়ানো বা কমানোর কোন সুযোগ নেই রানটাইমে । কালেকশন এই সমস্যার সমাধান করেছে । এটির সাইজ আপনার প্রয়োজন মত বাড়াতে এবং কমাতে পারবেন । + +২)লিংক লিস্ট নিয়ে কাজ করার সময় আপনি ইনডেক্সের সুবিধা পাবেন না । এটা একটা বড় সমস্যার কারন, কালেকশনে আপনি ইন্ডেক্স সুবিধা পাবেন । + +৩)কেবল প্রিমিটিভ নয়, সকল প্রকার অবজেক্ট এমনি একটি কালেকশনের মাঝে আরেকটি কালেকশন নিয়ে কাজ করার মত ফ্লেক্সিবিলিটি পাবেন । + +এছাড়া আরো বহুত সুবিধা আছে যেগুলা কাজ করতে করতে বুঝে যাবেন । + +নিচে কালেকশান ফ্যামিলি ট্রি দেখানোর চেষ্টা করা হল । + +```java +Collection + Set + HashSet + LinkedHashSet + SortedSet + TreeSet + List + ArrayList + Vector + LinkedList + Queue + LinkedList + PriorityQueue + +Object + Arrays + Collections + +Map + HashTable + LinkedHashMap + HashMap + SortedMap + TreeMap +``` + + From 85becb64f333054d6ac2806548b78970a1c12adf Mon Sep 17 00:00:00 2001 From: Ashikuzzaman Date: Thu, 3 Nov 2016 12:44:50 +0600 Subject: [PATCH 10/11] Added List and details operation of it in 11.md file --- 11.md | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) diff --git a/11.md b/11.md index 1348ad8..cd6272a 100644 --- a/11.md +++ b/11.md @@ -67,3 +67,153 @@ Map ``` +**লিস্ট ( List )** + +লিস্ট `List` একটি ইন্টারফেস যেটি সরাসরি `Collection` ইন্টারফেসকে এক্সটেন্ড করেছে । এটি যেহেতু একটি ইন্টারফেস ( `interface` ) তাই আমরা সরাসরি এটার কোন অবজেক্ট বা ইন্সট্যান্স ক্রিয়েট করতে পারবো না । এজন্য অবশ্য আমাদের চিন্তার খুব বেশি কারন নেই । `List` ইন্টারফেসকে ইমপ্লিমেন্ট করেছে `ArrayList` , `Vector` এবং `LinkedList` ক্লাস । আমরা খুব সহজে এগুলার মাধ্যমে `List` এর অবজেক্ট তৈরি করতে পারি । `List` হল আনসর্টেড অবজেক্ট কনটেইনার যেটি ডাটা ডুপ্লিকেসি সাপোর্ট করে । মানে একই ডাটা একাধিকবার থাকতে পারে লিস্টের মাঝে । + +`List` ডিক্লেয়ার করার নানা ধাপঃ + +ধাপ ১ঃ + +```java +import java.util.ArrayList; +import java.util.List; +import java.util.LinkedList; +import java.util.Vector; +public class Main { + public static void main(String[] args) { + List list; + list = new ArrayList(); + list2 = new LinkedList(); + list3 = new Vector(); + } +} +``` +ধাপ ২ঃ +```java +import java.util.ArrayList; +import java.util.List; +public class Main { + public static void main(String[] args) { + List list1 = new ArrayList(); + ArrayList list2 = new ArrayList(); + } +} +``` + +এমনকি কেউ চাইলে কালেকশনের অবজেক্ট নিয়েও কাজ করতে পারেন সেক্ষেত্রে যেটি করতে হবে । + +```java +import java.util.ArrayList; +import java.util.Collection; +public class Main { + public static void main(String[] args) { + Collection c = new ArrayList(); + } +} +``` + +ওকে অনেক হয়েছে । এবার কাজের কথায় আসা যাক । `List` নিয়ে কিভাবে কাজ করা যায় সেটাইতো জানা হলোনা এখনো ! ওকে আর বেশি বক বক করে আপনাদের ধৈর্য্যের পরীক্ষা নিবনা । প্রথমে আমরা দেখবো কিভাবে একটি লিস্টে ডাটা অ্যাড বা অ্যাসাইন করতে হয় । + +**লিস্টে ডাটা ইনসার্ট(Insert into List)** + +```java +import java.util.ArrayList; +import java.util.List; +public class Main { + public static void main(String[] args) { + List list = new ArrayList<>(); + list.add(7); + list.add(5); + list.add(13); + list.add(17); + list.add(3); + } +} +``` +উপরোক্ত কোডে `` দিয়ে বোঝানো হয়েছে এই লিস্টটি কেবল ইন্টিজার টাইপ ডাটার জন্য কাজ করবে । এটিকে জেনেরিক বলা হয় । চ্যাপটার ৮ এ আপনাদের এ বিষয়ে জানা কথা । তারপর `ArrayList` এর কনস্ট্রাকটর দিয়ে `list` অবজেক্টকে ইন্সট্যানশিয়েট করা হয়েছে । `add` মেথড এই লিস্টে একটি একটি করে ডাটা অ্যাড করে এবং একটি বুলিয়ান ভ্যালু রিটার্ন করে । যদি কোন কারনে কোন ডাটা অ্যাড করতে ব্যার্থ হয় তবে `false` ভ্যালু রিটার্ন করে । + +`add(int index, E element)` মেথডটি যেকোন একটি এলিমেন্ট লিস্টের নির্দিষ্ট ইনডেক্সে ইনসার্ট করে । `addAll(Collection c)` মেথডটি ইনপুট প্যারামিটার হিসাবে অন্য কোন একটি লিস্ট বা কালেকশন নিয়ে তার প্রতিটি এলিমেন্ট একটু একটি করে এই লিস্টে ইনসার্ট করে দেয় । `addAll(int index, Collection c)` মেথডটি ঠিক আগের মতই কাজ করে । নির্দিষ্ট ইনডেক্স থেকে অন্য একটি কালেকশনকে ইনজেক্ট করতে থাকে নতুন লিস্টের মাঝে । + + +**লিস্ট থেকে ডাটা রিড করা(Read from List)** + +উপরের কোড সেগমেন্টটি মনে করলাম আছে । আমরা কেবল ডাটা রিড করার জন্য কোডটি লিখবো । আমরা বেশ কয়েকভাবে দেখবো যে কিভাবে একটি লিস্ট থেকে ডাটা রিড করা যায় এবং এর মাধ্যমে আরো কিছু মেথড সম্পর্কে জেনে নিব । + +পদ্ধতি ১ঃ + +```java + for(int i=0; i { + System.out.println(x); + }); +``` + +হাল আমলের আলোচিত পদ্ধতি । এটিকে বলা হয় ফাংশনাল অপারেশন । জেডিকে ৮ এ এটিকে পরিচিত করানো হয়েছে । অনেকটা ফাংশনাল প্রাগ্রামিং এর মত করেই ডিজাইন করা করা । `forEach` মেথডটি একটি একটি করে এলিমেন্ট ট্রাভার্স করে যায় এবং তাকে যে কাজ করতে বলা হয় ঠিক সেই কাজটিই করে বসে থাকে । :D +দারুন মজার এই ফাংশনার অপারেশন । + + +**লিস্টের ভ্যালু রিপ্লেস করা** + +কোন একটি লিস্ট থেকে খুব সহজেই একটি ভ্যালু রিপ্লেস করে দেওয়া যায় । `set(int index, E element)` মেথডটি ২ টি ইনপুর প্যারামিটার নেয় । প্রথমে যে ইনডেক্সের ভ্যালু রিপ্লেস করতে হবে সেটি এবং তার পরে যে অবজেক্ট দিয়ে সেই স্থান পূরন করতে হবে সেটি। +```java +list.set(2, Integer.MAX_VALUE); +``` + + +**লিস্ট থেকে ডিলিট করা** + +খুব প্রচলিত ২ উপায়ে লিস্ট থেকে কোন একটি এলিমেন্ট ডিলিট বা রিমুভ করে দেওয়া যায় । একটি হল কোন একদি এলিমেন্ট বা অবজেক্ট কোন ইনডেক্সে আছে সেটা জানা এবং সেই ইনডেক্সকে রিমুভ করে দেওয়া । অথবা যে অবযেক্টটি রিমুভ করতে চাওয়া হচ্ছে সেই অবযেক্টটি দিয়ে বলা সেটি ডিলিট করতে । চলুন দেখি সেটি কিভাবে করা যায়ঃ + +পদ্ধতি ১ঃ +```java +list.remove(2); +``` +এই পদ্ধতি আপনি প্রিমিটিভ ইন্টিজার নাম্বার নাম্বার ইনপুট প্যারামিটার হিসাবে পাস করছেন । অর্থাৎ `remove` মেথডটি এটিকে ইনডেক্স হিসাবে বিবেচনা করবে । যদি 2 নাম্বার ইনডেক্সে অন্য কোন নাম্বার থাকে এবং ২ লিস্টে উপস্থিত থাকে তার পরেও সে ২ নাম্বার ইনডেক্সের ভ্যালুটিকে রিমুভ করবে এবং ওই ইনডেক্সের ভ্যালুটি রিটার্ন করবে । + +পদ্ধতি ২ঃ +```java +list.remove(new Integer(13)); +``` +এই পদ্ধতিতে আপনার লিস্টটি যে টাইপের অবজেক্ট কনটেইন করছে সেই টাইপের একটি অবজেক্ট দিলে সেটিকে ডিলিট করার চেষ্টা করবে । যদি উক্ত অবজেক্ট উপস্থিত থাকে ডিলিট করবে এবং `true` ভ্যালু রিটার্ন করবে অন্যথায় `false` রিটার্ন করবে । + + + +**লিস্ট সম্পর্কিত কিছু মেথড(Some methods of List)** + +`clear` মেথডটি উক্ত লিস্ট থেকে সব এলিমেন্ট রিমুভ করে দেয় । `contains` মেথডটি একটি অবজেক্ট ইনপুট হিসাবে নেয় এবং চেক করে যে উক্ত অবজেক্টরি লিস্টে প্রেজেন্ট কি না । ‍`indexOf` মেথসটি একটি অবজেক্ট ইনপুট হিসাবে নেয় এবং যদি সেই অবজেক্টটি ওই লিস্টে প্রেজেন্ট থাকে তবে তার ইনডেক্স রিটার্ন করে । অন্যথায় -১ রিটার্ন করে । `sort` নামক একটি মেথড আছে যেটি ইনপুট প্যারামিটার হিসাবে কম্পারেটর অবজেক্ট নিয়ে লিস্টটি সেই অনুযায়ী সর্ট করে । + +এরকম আরো বেশ কিছু মেথড এবং তাদের বিস্তর ব্যাখ্যা ওরাকলের অফিসিয়াল ডকুমেন্টেশন সাইটে পাওয়া যাবে । আগ্রহীরা সেখান থেকে দেখে নিতে পারেন । লিংকঃ http://docs.oracle.com/javase/8/docs/api/java/util/List.html + + + From 49c8cb34c1950d5476f5a99eb6ae05037b37ece2 Mon Sep 17 00:00:00 2001 From: Ashikuzzaman Date: Fri, 4 Nov 2016 02:04:31 +0600 Subject: [PATCH 11/11] Added list sorting technique in details --- 11.md | 258 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 257 insertions(+), 1 deletion(-) diff --git a/11.md b/11.md index cd6272a..cd138db 100644 --- a/11.md +++ b/11.md @@ -82,7 +82,7 @@ import java.util.LinkedList; import java.util.Vector; public class Main { public static void main(String[] args) { - List list; + List list, list2, list3; list = new ArrayList(); list2 = new LinkedList(); list3 = new Vector(); @@ -216,4 +216,260 @@ list.remove(new Integer(13)); এরকম আরো বেশ কিছু মেথড এবং তাদের বিস্তর ব্যাখ্যা ওরাকলের অফিসিয়াল ডকুমেন্টেশন সাইটে পাওয়া যাবে । আগ্রহীরা সেখান থেকে দেখে নিতে পারেন । লিংকঃ http://docs.oracle.com/javase/8/docs/api/java/util/List.html +**লিস্ট সর্ট করা(Sort a List)** +কোন একটি লিস্টকে সর্ট করার চেয়ে সহজ বিষয় আর কিছু হতেই পারেনা । তবে সমস্যা হল একটি লিস্টকে সর্ট করার নানাবিধ উপায় থাকায় আপনি কনফিউজ হয়ে যেতে পারেন যে আসলে কক্ষন কোন পদ্ধতিতে সর্ট করবেন । আমি নিজেও মাঝে মাঝে কনফিউজ হয়ে যাই । যাইহোক আমরা লিস্ট সর্টিং এর একেবারে বেসিক থেকে ধীরে ধীরে সামনের দিকে এগিয়ে যাব । বলে রাখা ভালো আমরা এখানে বেসিক্যালি ২ প্রকারের সর্টিং টেকনিক দেখবো এবং তাদের আবার ২ প্রকার সাব সর্টিং টেকনিক দেখবো । আগ্রহীরা আরো কিছুটা ঘাটাঘাটি করলে আরো অনেক কিছুই জানতে পারবে । + +পদ্ধতি ১ঃ + +```java +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +public class Main { + + public static void main(String[] args) { + + List list = new ArrayList<>(); + list.add(7); + list.add(5); + list.add(13); + list.add(17); + list.add(3); + + Collections.sort(list); + + list.forEach((x) -> { + System.out.println(x); + }); + } +} +``` + +এখানে আমরা `Collections` ক্লাসের একটি মেথড `sort` যেটি ইনপুট প্যারামিটার হিসাবে একটি লিস্ট অবজেক্ট নেয় এবং সেটিকে ইনপ্লেস সর্ট করে দেয় । অর্থাৎ এই মেথডের রিটার্ন টাইপ ভয়েড । এবং এটি অ্যাসেন্ডিং ( ছোট থেকে ক্রমান্বয়ে বড় ) অর্ডারে সর্ট করে । + +আমরা যদি ডিসেন্ডিং অর্ডারে সর্ট করতে চাই তবে আমাদের আরেকটু কাজ বেশি করতে হবে । আর সেটি হল `sort` নামক মেথডে আরেকটি প্যারামিটার পাস করতে হবে যেটি আসলে একটি `Comparator` অবজেক্ট । যেটার মাধ্যমে আমরা বলে দিব যে আসলে সর্টটি কোন অর্ডারে হবে বা কোন এলিমেন্টের সাপেক্ষে হবে । কোডটিকে সেক্ষেত্রে আমরা এভাবে লিখতে পারতাম, + +```java +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class Main { + + public static void main(String[] args) { + + List list = new ArrayList<>(); + list.add(7); + list.add(5); + list.add(13); + list.add(17); + list.add(3); + + Comparator comparator = new Comparator() { + @Override + public int compare(Integer t1, Integer t2) { + return t2-t1; + } + }; + + Collections.sort(list, comparator); + + list.forEach((x) -> { + System.out.println(x); + }); + } +} +``` + +উল্লেখ্য এখানে `Comparator` একটি ইন্টারফেস এবং এবং `compare` একটি `abstract` মেথড তাই আমাদের এটিকে ইমপ্লিমেন্ট করতে হয়েছে । ‍`compare` মেথডটি একটি ইন্টিজার নাম্বার রিটার্ন করে । দুটি অ্যাট্রিবিউটের মাঝে কম্পেয়ার করে পজেটিভ, নেগেটিভ বা শুন্য রিটার্ন করে । শুন্য রিটার্ন করা মানে দুটি সমান । পজেটিভ রিটার্ন করা মানে প্রথমটি বড় আর অন্যথায় ছোট । +আমরা আলাদা ভাবে `Comparator` এর অবজেক্ট ক্রিয়েট না করেও কাজটি করতে পারতাম ইনপ্লেসে । সেক্ষেত্রে এরকম হতে পারত, + +```java + Collections.sort(list, new Comparator() { + @Override + public int compare(Integer t, Integer t1) { + return t1-t; + } + }); +``` + +বর্তমান সময় যেহেতু ল্যামডা এক্সপ্রেশনের যুগ চলছে তাই এটিকে আরো সহজে এবং খুব সংক্ষেপে এভাবেও লেখা যেত, + +```java + Collections.sort(list, (Integer t1, Integer t2) -> t2-t1); +``` + +কাজ বেসিক্যালি সব একই ভাবে করছে । + + +এতক্ষন আমরা দেখলাম প্রিমিটিভ টাইপের ডাটার একটি লিস্ট সর্ট করা । এমনতো হতেই পারে যে আপনার কাছে একটি কাষ্ট টাইপের অবজেক্ট কনটেইন করে এমন একটি লিস্ট সর্ট করতে হবে ওই অবজেক্টের নির্দিষ্ট কোন এক বা একাধিক প্রপার্টির সাপেক্ষে । সেক্ষেত্রে করনীয় কি সেটা এবার চলুন দেখে ফেলি । + + +```java +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +class Employee { + + int id; + String name; + int age; + int salary; + + public Employee(int id, String name, int age, int salary) { + this.id = id; + this.name = name; + this.age = age; + this.salary = salary; + } +} + +public class Main { + + public static void main(String[] args) { + + List list = new ArrayList<>(); + list.add(new Employee(1, "Abul", 27, 35000)); + list.add(new Employee(2, "Babul", 25, 37000)); + list.add(new Employee(3, "Kabul", 29, 30000)); + list.add(new Employee(4, "Mofiz", 24, 36000)); + list.add(new Employee(5, "Hafiz", 28, 34000)); + + Collections.sort(list, new Comparator(){ + @Override + public int compare(Employee t, Employee t1) { + return t.age - t1.age; + } + }); + + list.forEach((x) -> { + System.out.println(x.salary); + }); + } +} +``` + +ঠিক আগের মতই কাজ করতে পারবেন । তবে এখানে অবজেক্ট নিয়ে কাজ করতে হবে । এবং অবজেক্টের কোন ফিল্ডের রেসপেক্টে সর্ট করতে চাচ্ছেন সেটাও ডিফাইন করে দিতে হবে । অ্যাসেন্ডিং বা ডিসেন্ডিং যেকোন ভাবেই সর্ট করতে পারবে । এমনকি একাধিক ফিল্ডের রেসপেক্টে যদি সর্ট করতে চান সেটাও করতে পারবে । আপনারা চাইলে ল্যামডা এক্সপ্রেশন ব্যাবহার করতে পারতেন সেক্ষেত্রে এরকম হতো কোডটি, + +```java + Collections.sort(list, (Employee t, Employee t1) -> t1.age – t.age);//descending order +``` + + +এবার আমরা একটু ভিন্ন একটা পদ্ধতি দেখবো । যদি এমন হয় যে আমাদের এই ক্লাসটি প্রায়ই সর্ট করতে হয় এবং নির্দিষ্ট একটা অর্ডারে সর্ট করতে হয় , সেক্ষেত্রে আমরা একটা বিশেষ কাজ করতে পারি । আমরা `Comparable` ইন্টারফেসটি ইমপ্লিমেন্ট করতে পারি । `Comparable` ইন্টারফেসের মাঝে `compareTo` মেথডটি অভাররাইড করলেই কাজ শেষ । অ্যাসেন্ডিং বা ডিসেন্ডিং আগের মতই । তবে চলুন দেখি কিভাবে সেটি করা যায় সেটি দেখে ফেলি । + + +```java +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +class Employee implements Comparable { + + int id; + String name; + int age; + int salary; + + public Employee(int id, String name, int age, int salary) { + this.id = id; + this.name = name; + this.age = age; + this.salary = salary; + } + + @Override + public int compareTo(Employee t) { + return this.age - t.age; + } +} + +public class Main { + + public static void main(String[] args) { + + List list = new ArrayList<>(); + list.add(new Employee(1, "Abul", 27, 35000)); + list.add(new Employee(2, "Babul", 25, 37000)); + list.add(new Employee(3, "Kabul", 29, 30000)); + list.add(new Employee(4, "Mofiz", 24, 36000)); + list.add(new Employee(5, "Hafiz", 28, 34000)); + + Collections.sort(list); + + list.forEach((x) -> { + System.out.println(x.id + ", " + x.name + ", " + x.age + ", " + x.salary); + }); + } +} +``` + +এভাবে খুব সহজেই আমরা একটি অবজেক্টের লিস্ট সর্ট করতে পারি । তবে একটি বিষয় লক্ষ করার মত বিষয় হচ্ছে যে আপনাদের যে ২ প্রকারের সর্ট দেখানো হয়েছে অবজেক্টের লিস্টের ক্ষেত্রে এই দুই প্রকার কিন্তু একত্রেও ব্যাবহার করতে পারবেন । তবে সেক্ষেত্রে প্রায়োরিটি পাবে ক্লোজার ফাংশন । চলুন দেখি বিষয়টা কি একটু দেখে নেই । + +```java +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +class Employee implements Comparable { + + int id; + String name; + int age; + int salary; + + public Employee(int id, String name, int age, int salary) { + this.id = id; + this.name = name; + this.age = age; + this.salary = salary; + } + + @Override + public int compareTo(Employee t) { + return this.age - t.age; + } +} + +public class Main { + + public static void main(String[] args) { + + List list = new ArrayList<>(); + list.add(new Employee(1, "Abul", 27, 35000)); + list.add(new Employee(2, "Babul", 25, 37000)); + list.add(new Employee(3, "Kabul", 29, 30000)); + list.add(new Employee(4, "Mofiz", 24, 36000)); + list.add(new Employee(5, "Hafiz", 28, 34000)); + + Collections.sort(list, ((Employee e1, Employee e2) -> (e2.salary + e1.salary))); + + list.forEach((x) -> { + System.out.println(x.id + ", " + x.name + ", " + x.age + ", " + x.salary); + }); + } +} +``` + +এখানে যদিও `Employee` ক্লাস `Comparable` ইন্টারফেস ইমপ্লিমেন্ট করেছে এবং `compareTo` মেথডে বলে দেওয়া হয়েছে `age` এর অ্যাসেন্ডিং অর্ডারে সর্ট করতে হবে কিন্তু এটি সর্ট করবে `salary` এর ডিসেন্ডিং অর্ডারে । কেন সেটা করছে সেটা নিশ্চয় বুঝতে পেরেছেন । + +আপনারা চাইলে কিন্তু `List` এর অন্তর্গত `sort` মেথড ব্যাবহার করেও সর্ট করতে পারতেন । সেটা করার জন্য খুব বেশি কিছুই করতে হতনা । সেটি অলরেডি আপনারা জানেন কিভাবে সেটি করা যায় । + +```java + list.sort(new Comparator(){ + @Override + public int compare(Employee t, Employee t1) { + return t1.age - t.age; + } + + }); +``` + +বেসিক্যালি এভাবে খুব সহজেই একটি লিস্ট সর্ট করা যায় । আপনারা আরো বেশি আগ্রহী হলে ওরাকলের ডকুমেন্টেশন পড়তে পারেন । আরো বেশি পরিষ্কার হবে ধারনা । + + +#–-------চলবে--------#