Friday, November 30, 2018

Android এর টাইটেল বার যেভাবে হাইড করে দেবো ? (Part-5)

                                 Android Hide Title Bar and Full Screen Example    
                              ---------------------------------------------------------------

যখন আমাদের অ্যাপের , উপরের  Title Bar টা হাইড করে , পুরো   activity এর স্ক্রিন জুড়ে  content শো করাতে চাও , তাহলে , activity এর একটা মেথোড আছে  , সেটা ইউজ করতে হবে  প্রথমে টাইটেল হাইড করতে হবে requestWindowFeature(Window.FEATURE_NO_TITLE); বাট setContentView method এর আগে , অর্থাৎ , এই  activity তে কোন  layout শো করাবে ? সেটা সেট করার আগে , আমাদের টাইটেল হাইড  করার মেথোড ইউজ করতে হবে ,এখন টাইটেল হাইড সুতরাং বার হাইড করতে হবে , সেইজন্য আমাদের প্রথমে , ActionBar class নামক ক্লাসের একটা ইন্সট্যান্স ক্রিয়েট করে , এই ক্লাস এর hide() method টা কল করতে হবে, তাহলে আমরা লিখবো এইভাবে getSupportActionBar().hide(); এখন আমাদের টাইটেল আর বার দুটাই হাইড হয়ে গেলো । এখন ফুলস্ক্রিনে আমাদের কনটেন্ট কে শো করাতে হবে , তাহলেই আমাদের কাজ শেষ । ।

এখন আমাদের  Window class এর একটা ইন্সট্যান্স ক্রিয়েট করে , setFlags() নামক মেথোডকে কল করতে হবে আর , WindowManager.LayoutParams.FLAG_FULLSCREEN constant কে আমরা মেথোডের ভেতরে পাস করাতে হবে , আমরা যেয়াভবে করবো ---  this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
               WindowManager.LayoutParams.FLAG_FULLSCREEN);

তাহলে আমাদের টাইটেল আর বার হাইড এবং ফুল স্ক্রিনে অ্যাক্টিভেট হয়ে গেলো , কনটেন্ট । তাহলে , এখন স্যাম্পল ফুল একটা কোড দেখে আসি , জাভা ফাইল এর

    package first.javatpoint.com.hidetitlebar; 
     
    import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 
    import android.view.Window; 
    import android.view.WindowManager; 
     
    public class MainActivity extends AppCompatActivity { 
     
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            requestWindowFeature(Window.FEATURE_NO_TITLE); //will hide the title  
            getSupportActionBar().hide(); // hide the title bar 
            this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                   WindowManager.LayoutParams.FLAG_FULLSCREEN); //enable full screen 
            setContentView(R.layout.activity_main); 
     
     
        } 
    } 

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

এখন টাইটেলবার সহ আর টাইটেলবার ছাড়া দুইটা ছবি দেখে নিলেই পরিষ্কার হয়ে যাবে ।






বা পাশেরটা টাইটেল( ল্যাবেল) বার সহ  আর ডান পাশেরটা টাইটেল বার ছাড়া ।। আশা করি , এই বিষয়টি পরিষ্কার হয়ে গেছে । আজ এইটুকুই \\\


Android Manifest ফাইল ও কিছু কথা ( Part -4)

  Manifest file
                                        --------------------
AndroidManifest.xml এক ধরনের xml ফাইল যেটা একটা অ্যাপ্লিকেশনের root directory তে থাকে ,   সাধারণত বিভিন্ন ধরনের ইনফরমেশন বহন করে আমার package এর  যেমন  components of the application such as activities, services, broadcast receivers, content providers etc. এটার আরো সামান্য কিছু কাজ আছে ,যা এরকম ----

1) ধরো , আমার একটা অ্যাপ চালাতে হলে ,ধরো -- নেট লাগবে তাহলে , আমার এই  AndroidManifest ফাইলে সেটা উল্লেখ করে দিতে হবে ।
২) এটা এটাও ডিক্লেয়ার করে যে , কোন কোন android api আমাদের অ্যাপ্লিকেশন ইউজ করবে ?
৩)এছাড়া instrumentation classes লিস্টিং এর দ্বরাই হয় ।


আমরা একটা  ( Sample ) ফাইল দেখে নেই , নীচে ----

    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
        package="com.javatpoint.hello" 
        android:versionCode="1" 
        android:versionName="1.0" > 
     
        <uses-sdk 
            android:minSdkVersion="8" 
            android:targetSdkVersion="15" /> 
     
        <application 
            android:icon="@drawable/ic_launcher" 
            android:label="@string/app_name" 
            android:theme="@style/AppTheme" > 
            <activity 
                android:name=".MainActivity" 
                android:label="@string/title_activity_main" > 
                <intent-filter> 
                    <action android:name="android.intent.action.MAIN" /> 
     
                    <category android:name="android.intent.category.LAUNCHER" /> 
                </intent-filter> 
            </activity> 
        </application> 
     
    </manifest> 

একাহ্নে আমরা বিভিন্ন ইলিমেন্ট নিয়ে একটু কথা বলি , যেমন ---

<manifest>

manifest হলো  একটা  root element , AndroidManifest.xml file এর। এটাতে package attribute থাকে ,যেটা  describe করে ,   package এর নাম    আমাদের activity class এর !

<application>

application,হলো  manifest এরই এক ধরনের  subelement . এর ভিতরে আরো অনেক  subelements থাকে , যেমন  activity, intent-filter যেসব অ্যাপ্লিকেশনের বিভিন্ন  ধরনের component গুলো  ডিক্লেয়ার করে !!

সবচেয়ে বেশী যেসব অ্যাট্রিবিউট ব্যবহার করা হয় সেসব হলো ---  icon, label, theme এসব।

android:icon     android application components গুলোর আইকন কেমন হবে ? সেটা ঠিক করে !!

android:label  এটা মূলত  application এর নাম শো করার জন্য ।

android:theme  সকল android activities এর জন্য কমন থিম রিপ্রেসেন্ট করে !!

 ব্যবহারের মাধ্যমেই এই জিনিস গুলো আরো পরিষ্কার হয়ে যাবে , তোমাদের কাছে । কোনো বিষয় , ক্লিয়ারলি না বুঝলে পরে জিনিসগুলো পরিষ্কার হয়ে যাবে ।

<activity>

activity, application এরই আরেক ধরনের subelement, এটার অনেক  attributes আছে যেমন  label, name, theme, launchMode etc.

android:label এটা বিভিন্ন activity,on the screen এ থাকা অবস্থায় কি নামে পেইজ শো হবে তার নাম ।
যেমন , এখানে আমাদের এক্টিভিটিতে label অনুযায়ী  welcome শো হচ্ছে নীচে ছবি'তে  --



android:name  এটা activity class এর নাম এর সাথে ডিল করে  .


<intent-filter>

intent-filter , activity এরই  এক ধরনের  sub-element বিভিন্ন ধরনের  intent ইঙ্কলুড করে ,  যার সাথে  activity, service or broadcast receiver ইত্যাদি , ইন্টারএক্ট করতে পারে  ।

<action>

intent-filter এর অবশ্যই কমপক্ষে একটা হলেও  ,action element  থাকবে ।

action element বিষয়গুলা পরবরতীতে আরো ক্লিয়ার হবে অনেক ।

<category>

এটা intent-filter  এ , একটা  category নাম যুক্ত করে । ।


এই যাবতীয় বিষয়গুলি এখন একটু ধারণা থাকলেও চলবে , কারণ এসব নিয়ে পরে বিস্তারিত আলোচনা হবে , শুধু আমাদের জানতে হবে যে - এসব নিয়ে একটা বিষয় আছে !! তাই এখনই না বুঝলে , ঘাপড়ানোর কোনো দরকার নেই ।। আজ এইটুকুই থাক -----

" Hello World " যেভাবে কাজ করছে ? ( Part -3)



এখন তোমার বানানো প্রথম অ্যাপটি ,  "Hello World" প্রিন্ট করে !! এখানে , Internal কিছু ব্যপার আমরা জেনে নেই , চলো ---

একটা Android application এ বিভিন্ন ধরনের   components যেমন  java source code, string resources, images, manifest file, apk file etc.থাকে !!  আমরা একটু একটু করে বোঝার ট্রাই করি ,সবকিছু -----

প্রথমে দেখে নেই , জাভা ফাইল

MainActivity.java

    package com.example.helloandroid; 
    import android.os.Bundle; 
    import android.app.Activity; 
    import android.view.Menu; 
    import android.widget.TextView; 
    public class MainActivity extends Activity {//(1) 
        @Override 
        protected void onCreate(Bundle savedInstanceState) {//(2) 
            super.onCreate(savedInstanceState); 
                   
            setContentView(R.layout.activity_main);//(3) 
        } 
      
    } 

Activity এমন এক ধরনের জাভা ক্লাস ,যেটা একটা  default window বানায় যেকোনো  Android স্ক্রিনের উপরে ,যেখানে আমরা আমাদের বিভিন্ন কম্পোনেন্ট যেমন Button, EditText, TextView, Spinner etc। এটার অন্তর্ভুক্ত কিছু মেথোড আছে , যেমন --- onCreate, onStop, OnResume etc ।

এখানে , onCreate method টা হলো যখন  Activity প্রথম খোলা হয় , তখন এই মেথোড কল করা হয় । আমাদের অ্যাক্টিভিটি ক্লাস যখন আমাদের জন্য , একটা  window বানাবে  android screen এ , তখন সেই স্ক্রিনে আমরা কিরকম পেইজ শো করবো বা, যে পেইজে আমরা বিভিন্ন কম্পোনেন্ট বসাবো , সেটা ডিজাইন করে নিতে হবে আলাদা  layout ফাইলে , আর সেই ফাইলটা'টাই
setContentView(R.layout.activity_main) ; মাধ্যমে একটিভিটিতে সেট করে দিতে হবে , এর মানে এই এক্টিভিটি যখন চালু হবে তখন পেইজ এ এই  layout এর পেইজটি শো হবে ।

এখন  android অ্যাপ বানাতে গিয়ে একটা R.java file অটোমেটিক জেনারেট হবে (Android Asset Packaging Tool) এর সাহায্যে ! এটাতে মূলত সব ধরনের resource এর জন্য এক ধরনের  ID জেনারেট হবে । যেমন, আমি যদি কোনো কম্পোনেন্ট বানাই  activity_main এ , তখন এই কম্পোনেন্ট এর জন্য একটা আইডি জেনারেট হয়ে যাবে  R.java file এ , এখানে আমাদের কোনো অংশ ডিলিট বা যোগ করার কোনো প্রয়োজন নেই , এটা অটোমেটিক জেনারেট করে । এটা পরবর্তীতে  Java Source file এ কাজে লাগে ।

APK File  ---- এটা  framework এর সাহায্যে  automatically ক্রিয়েট হবে ,এটা অ্যান্ড্রোয়েড ফোনে ট্রান্সফার করে রান করালে , সবকিছু ঠিক থাকলে , তোমার নির্দেশনা অনুযায়ী রান হবে ।

Resources----- এটাতে ,সকল প্রকার রিসোর্স থাকে ,যেমন  activity_main, strings, styles , drawables ইত্যাদি । ।

এসব বিষয়গুলি নিয়ে এখন কিছুটা ধারণা থাকলেই চলবে , পরে বিষয়গুলি আরো পরিষ্কার হয়ে যাবে , আশা করি , কিন্তু  OOP ( Object Oriented Programming )  নিয়ে সঠিক ধারণা না  থাকলে ,েই টিউটরিয়াল অনুযায়ী না আগানোই ঠিক হবে , কারণ অনেক ক্ষেত্রেই অনেক কিছু বুঝতে অসুবিধে হবে । আশা করি , OOP ( Object Oriented Programming )  এর বেসিক ধারণা তোমার পরিষ্কার থাকবে । আজ এটুকুই ।

First "Hello World " ( Part-2)

প্রথম  "Hello World " অ্যাপ বানানোর জন্য আমরা নেট  থেকে , Android studio  সফটওোয়ার'টি নামিয়ে নেই  ।। আশা করি গুগল আর ইউটিউব এর সাহায্যে , তোমরা এটা ডাউনলোড আর ইন্সটলের কাজ করে নিতে পারবে ------

এবার ছবির সাহায্যে একে একে দেখে নেই  , চলো --  কিভাবে কাজ শুরু করতে হবে ? 






                                  



এবার আমরা  activity_main.xml  যে দেখতে পাচ্ছি , সেখানে ঢুকে নিচের মতো করে সাজিয়ে নেই , অনেক সময় ডিফল্ট আকারে দেয়াই থাকে , যদি না থাকে তাহলে নীচের থেকে কপি পেস্ট করে বসিয়ে নাও ।


  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"  
  4.     xmlns:tools="http://schemas.android.com/tools"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"  
  7.     tools:context="first.javatpoint.com.welcome.MainActivity">  
  8.   
  9.     <TextView  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="Hello Android!"  
  13.         app:layout_constraintBottom_toBottomOf="parent"  
  14.         app:layout_constraintLeft_toLeftOf="parent"  
  15.         app:layout_constraintRight_toRightOf="parent"  
  16.         app:layout_constraintTop_toTopOf="parent" />  
  17.   
  18. </android.support.constraint.ConstraintLayout>  


এরপর  MainActivity.java  ফাইল দেখে নেই একবার আমি নীচে কোড দিয়ে দিলাম , মিলিয়ে নাও


  1. package first.javatpoint.com.welcome;  
  2.   
  3. import android.support.v7.app.AppCompatActivity;  
  4. import android.os.Bundle;  
  5.   
  6. public class MainActivity extends AppCompatActivity {  
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.activity_main);  
  11.     }  
  12. }  

এবার নিচের ছবির দিখে লক্ষ করে  ইমুলেটর রান করাও ----


এখন ৩-৪  মিনিট অপেক্ষা করো , দেখবা তোমার প্রথম অ্যাপ্লিকেশন রান হবে ,  দেখতে হবে







তুমি , তোমার প্রথম একটা অ্যান্ড্রোয়েড অ্যাপ্স বানিয়েই ফেলেছো !!!!! আজ এইটুকুই --------

Android কি ও কিভাবে ? ( Part-1)

  What is Android ?

Android  এক ধরনের , লিনাক্স বেইসড অপারেটিং সিস্টেম , মূলত স্মার্ট ফোন , ট্যাবলেট ইত্যাদিতে ব্যবহার করা হয় !! জাভা  প্রোগ্রামিং  ল্যাঙ্গুয়েজই  স্বভাবত ব্যবহার করা হয় , Android কোড লিখার জন্য । এই      Android  অপারেটিং সিস্টেম ও কার্নেল এর ম্যক্সিমাম অংশ সি ও জাভা  দিয়ে  লিখা  , সি প্লাস প্লাস এরও কিছু ব্যবহার রয়েছে এখানে ।

মূলত , এই  Android প্রোজেক্ট এর উদ্দেশ্য হলো ,তারা এটাকে  real-world product হিসেবে গড়ে তুলবে যা খুবই ইউজার ফ্রেন্ডলি হবে । Android এর বেশ কয়েকটা code name ইতিমধ্যে চলে গেছে , যেমনঃ-  Lollipop, Kitkat, Jelly Bean,Froyo, Ecliar, Donut etc ।।

এই  Android সিস্টেম  প্রথমে  শুধু গুগল দ্বারা ডেভলপড হলেও , পরে  OHA (Open Handset Alliance) এর তত্বাবধায়নে চলে আসে ২০০৭ সালে , যদিও  প্রায় ৮৪ টি কম্পানি নিয়ে  এই OHA গুগলই প্রতিষ্ঠা করে ।

অ্যান্ড্রোয়েড এর অনেক সুযোগ সুবিধের জন্য , এটা এখনো অনেক জনপ্রিয় । বিশেষ করে বিভিন্ন ক্লাসের মানুষ তাদের সাধ্য অনুযায়ী , এর স্মার্ট ফোন ব্যবহার করতে পারে !! বিভিন্ন ধরনের অ্যাপ্লিকেশন রয়েছে  এই   Android সিস্টেম এ ,  তার মধ্যে উল্লেখযোগ্য অ্যাপ এর ধরণগুলো    হলো ---

                                      
    Entertainment
    Tools
    Communication
    Productivity
    Personalization
    Music and Audio
    Social
    Media and Video
    Travel and Local etc.

 গুগলের  Android Incorporation প্রথম প্রধান যে ইমপ্লয়িরা ছিলেন তারা হলেন , Andy Rubin, Rich Miner, Chris White and Nick Sears.তাদের চিন্তাধারা মূলত ক্যামেরা কেন্দ্রিক ছিলো , তারা ক্যামেরা ভিত্তিক সিস্টেম বানানোর কথা ভাবছিলেন ,সেই সময় তারা তাদের দূরদরশি'তার পরিচয় প্রদান করেন !! তারা চিন্তা করেন এক সময় ক্যামেরার প্রয়োজন ফুরিয়ে যাবে আর সেই স্থান মোবাইলের ক্যামেরা সিস্টেম দখল করে নিবে ! ! তখন তারা তাদের চিন্তা পরিবর্তন করে মোবাইলের জন্য এই  Android সিস্টেম ডেভেলপ করেন ।  এই  Android নামটা মূলত  Andy Rubin এর ডাকনাম ছিলো , তার গুগলের কলিগরা তার রোবোটের প্রতি অতিরিক্ত আগ্রহের ফলে এই নামটা রেখেছিলো , যা আজ পুরো একটা মোবাইল অপারেটিং সিস্টেম এর নাম হয়ে গছে ! ২০০৭ সালে , গুগল প্রথম
android OS(অপারেটিং সিস্টেম) এর কথা announce করে , তারপর ২০০৮ সালে   HTC প্রথম অ্যান্ড্রোয়েড মোবাইলের সূচনা করেন !!


নীচে কিছু  Android এর ভার্সন ও  API Level উল্লেখ করা হলো !!!



Version              Code name       API Level
1.5               Cupcake            3
1.6               Donut            4
2.1               Eclair            7
2.2               Froyo            8
2.3               Gingerbread      9 and 10
3.1 and 3.3       Honeycomb     12 and 13
4.0               Ice Cream Sandwitch    15
4.1, 4.2 and 4.3   Jelly Bean          16, 17 and 18
4.4               KitKat            19
5.0               Lollipop            21
6.0               Marshmallow            23
7.0               Nougat           24-25
8.0               Oreo                   26-27


এবার আমরা  Android এর আরকিটেকচার নিয়ে হালকা কিছু কথা বলবো , ধারণ দেবার জন্য  ।।     android architecture  কে পাচটা ভাগে ভাগ করা যায় :

    ১)  linux kernel
   ২)   native libraries (middleware),
   ৩)  Android Runtime
   ৪)  Application Framework
  ৫)  Applications



  এবার আমরা , এগুলো নিয়ে সামান্য আলোচনা করবো ----

1) Linux kernel

এটা  Android আর্কিটেকচার এর একদম মূল হিসেবে ধরা হয় . device drivers, power management, memory management, device management and resource access এগুলো'র জন্য  Linux kernel ই মূল রিস্পন্সিবল !!

2) Native Libraries

এটা ঠিক  Linux kernel এর উপরেই থাকে , অনেক ধরনের Native libraries আছে  যেমন, WebKit, OpenGL, FreeType, SQLite, Media, C runtime library (libc) etc. WebKit এর জন্যই বিভিন্ন ব্রাউজার আমরা সাপোর্ট করাতে পারি , SQLite মুলত ডেটাবেইস এর কারণে ব্যবহার হয় , Media এর কারনেই বিভিন্ন অডিও ভিডিও রেকরডিং আমরা করতে পারি , যাই হোক এরকম অনেক উদাহরণই দেয়া যাবে ।

3) Android Runtime

এটা খুবই গুরুত্বপূর্ণ একটা অংশ , এখানে  core libraries and DVM (Dalvik Virtual Machine) আছে যা একটা  Android অ্যাপ্লিকেশন রান করে ,অনেক সময় একটা অ্যাপ হ্যাং হয়ে যায় অথবা , চলতে সময় নেয় তখন বুঝতে হবে  DVM ফাস্টভাবে কাজ করতে পারছে না !! যারা জাভার সাথে পরিচিত , তারা অবশ্যই JVM (Java Virtual Machine) এর নাম শুনেছো , এটাও সেরকমই একটা ভার্চুয়াল মেশিন বাট এটা মোবাইল ডিভাইস এর জন্য বানানো ।

4) Android Framework

Native Libraries এবং  Android Runtime এর ঠিক উপরেই আমাদের  Android Framework অবস্থিত  !! এটা ছাড়া বলতে গেলে , পুরো সিস্টেম অচল ! বিভিন্ন Android API যেমন  , UI (User Interface), telephony, resources, locations, Content Providers (data) and package managers এগুলো এই ফ্রেইমওয়ারকেই থাকে । এই ফ্রেইমওয়ারক অনেক classes and interfaces , provide করে android application development এর জন্য ।

5) Applications

 android framework এর ঠিক উপরেই , অনেক applications আছে  যেমন , home, contact, settings, games, browsers যারা  android framework উপর ভিত্তি করে চলে ,  আর android framework ডিপেন্ড করে android runtime and libraries এর উপর  আর , Android runtime and native libraries ডিপেন্ড করে  linux kernal এর উপরে ।

এভাবেই , একটা  android সিস্টেম  গড়ে ওঠে সুন্দরভাবে । ।

পরবর্তীতে , আরো কিছু বিষয় নিয়ে আলোচনা করবো , আজ এইটুকুই --------------

Tuesday, November 27, 2018

ArrayList , Vector , LinkedList , Vector , HashSet, LinkedHashSet, TreeSet , String এর বহুরুপী মেথোড সমূহ !!

   " ArrayList ,Vector , LinkedList & Stack "
                                   --------------------------------------------- 

আজকের আলোচনার বিষয় -  ArrayList . আমাদের এই কনটেইনার  Collection ইন্টারফেইস'কে ইনহেরিট করে আর তাই , Collection এর সব মেথড ইনহেরিট করে !!

 আমাদের ইনিশিয়ালাইজ এর ক্ষেত্রে ,  ArrayList<Integer>a=new ArrayList<Integer>(); এভাবে ইনিশিয়ালাইজ  করতে হয় , নিজের ইচ্ছেমতো নাম ব্যবহার করা যায় !!

আমরা কোনো সংখ্যা যোগ করার সময় , এভাবে যোগ করতে পারি ,     a.add(7);
                                          a.add(9);
                                          a.add(5);

আমরা যদি কিছু রিমুভ করতে চাই , তাহলে ইন্ডেক্স উল্লেখ করে রিমুভ করতে পারি !!!  a.remove(0); এর মানে এখানে সবচেয়ে প্রথম ইন্ডেক্সে থাকা মান    7  রিমুভ হয়ে যাবে । এখন  9 রিমুভ করতে চাইলে , কিন্তু আমাদের তাহলে   a.remove(1); লিখতে হবে ।

এখন কোনো ইন্ডেক্স এর মান যদি আমরা চেইঞ্জ করে দিতে চাই , তাহলে    a.set(1,89); এর মানে হলো  ArrayList এর ১ নং উপাদান'টি  89 দ্বারা রিপ্লেইস হবে ।

এখন এই  ArrayList তে কোনো নাম্বার , কততম ইন্ডেক্সে আছে ? তা জানতে  চাইলে আমরা যে মেথোড ইউজ করবো , int index=a.indexOf(9); তাহলে , 9  যে ইন্ডেক্সে আছে , তা রিটার্ন করবে !!!  এখন ধরো , ArrayList  এ অনেকগুলো ২৩ আছে , কিন্তু আমার দরকার সবচেয়ে শেষ এর ২৩ কততম ইন্ডেক্সে আছে ? সেটা প্রিন্ট করো , তাহলে সেক্ষেত্রে কিন্তু আমাদের , a.indexOf(23) এর বদলে   a.lastIndexOf(23) ব্যবহার করতে হবে !!  এখন কথা হলো , আমরা যে সংখ্যার ইন্ডেক্স পাবার জন্য এই মেথোড দুটি ব্যবহার করছি , সেই সংখ্যাটিই যদি আমাদের লিস্টে না থাকে , তাহলে কিন্তু , আমাদের এই দুটি ফাংশন  -1 রিটার্ন করবে , তখন আমাদের বুঝে নিতে হবে , আমরা যে সংখ্যা খুজছি , সেটা আমাদের লসিটে নেই !! আমরা এটা অন্য একটা বুলিয়ান ফাংশন এর সাহায্যেও করতে পারি , যেমনঃ- boolean i=a.contains(9);যদি  9 আমাদের লিস্টে  থাকে তাহলে  i এর মান true হবে ,না হলে false হবে ।

আমাদের  ArrayList খালি নাকি খালি নয় , সেটা চেক করা যায় এভাবে ---   " if(a.isEmpty()==true) "  // তাহলে খালি , না হলে  নয়

ArrayList এর সাইজ জানতে চাইলে , আমরা --  a.size() ব্যবহার অরতে পারি !!

আমরা যেকোনো ইন্ডেক্সের মান প্রিন্ট করতে  চাইলে  , System.out.println(get(0)); এভাবে  প্রিন্ট করতে পারি !!

এখানে আরো একটি মজার মেথোড ব্যবহার ইউজ করা যায় , সেটা হলো toString() !! ধরো , আমাদের লিস্টে আছে , শুধু   ৯  আর  ৮৯ তাহলে , আমাদের লিস্ট কে যদি স্ট্রিং এ কনভার্ট করা যায় , আথলে প্রিন্ট করবে এরকম  [9, 89]  , নিজে নিজে ব্যবহার করে সব মেথোড গুলো আরো একবার ভালো করে শিখে নাও

সবশেষে আমাদের লিস্ট ক্লিয়ার অরতে চাইলে  a.clear(); এই মেথোডের মাধ্যমে আমরা পরিষ্কার করতে পারি পুরো লিস্ট !!

এখন , Vector & LinkedList ও ,এই  ArrayList  এর মতোই , এই সকল মেথোড ইনহেরিট করতে পারে শুধু  ArrayList এর  জায়গায়   Vector অথবা  LinkedList লিখে ইউজ করলেও সব এভাবেই ব্যবহার করতে পারবা   !!  এখন  Vector এর সাবক্লাস হিসেবে Stack রয়েছে , যা এই লিস্ট এর সব মেথোডই ইনহেরিট করবে এবং , সাথে আরো কিছু এক্সট্রা কিছু মেথোড ইনহেরিট করবে !!

তো , চলো  Stack নিয়ে আলোচনা শুরু করা যাক , Stack এর আরো কিছু মেথোড নিয়ে  আমরা আলোচনা করবো -------

Stack<Integer>a=new Stack<Integer>();

আমরা যদি , Stack এ কোনো ইলিমেন্ট ঢুকাতে   চাই  তাহলে a.add(5); এর পাশাপাশি  a.push(89);মেথোডো ইউজ করতে পারি !! এই মানটি সবার উপরে যুক্ত হবে

আময়াদের আরো গুরুত্বপূর্ণ  দুইটি মেথোড আছে , তা হলো --  a.peek() ও  a.pop()

a.peek() মেথোডটি  স্ট্যাক এর সবচেয়ে উপরের মানটি , রিটার্ন করবে ,কিন্তু স্ট্যাক এর কোনো পরিবর্তন হবে না !! কিন্তু , a.pop() শুধু   স্ট্যাক এর সবচেয়ে উপরের মানটি , রিটার্ন করবে না - সাথে সবচেয়ে উপরের মানটি রিমুভ করে দিবে স্ট্যাক থেকে ।  

সুতরাং ,  ArrayList , Vector , LinkedList আর  Stack সবগুলো কনটেইনার এই উপরের সবগুলো মেথোড ইনহেরিট করে , কিন্তু   Stack এ আরো বেশি কিছু  মেথোড আছে , যা ব্যবহার করা যায় !!  আজকের আলোচনা এখানেই শেষ হোক ...


                                                      Set
                                                   ---------

Set এর অন্তর্ভুক্ত বহুল ব্যবহৃত   মোটামুটি তিনটি কনটেইনার আছে  , এর একটা কমন গুণ হলো , এটা কোনো ডুপ্লিকেইট ইলিমেন্ট রাখে না , সব ইউনিক ইলিমেন্ট রাখে ।

1)  HashSet
2)  LinkedHashSet
3)  TreeSet

HashSet এ থাকা কনটেইনারের কোনো ডুপ্লিকেইট ইলিমেন্ট থাকে না , আর সবগুলো মান শরটেড থাকে যেমন,

                           HashSet<Integer>a=new HashSet<Integer>();

                            a.add(7);
                            a.add(9);
                            a.add(5);

 তাহলে ইলিমেন্ট গুলোর , যা অর্ডার হবে , তা হলো ----  [5, 7, 9]     
 এখন যদি , আমরা LinkedHashSet এর কথা চিন্তা করি , তাহলে একটু দেখি , ইলিমেন্ট গুলো কিভাবে থাকে ?

                           LinkedHashSet<Integer>a=new LinkedHashSet<Integer>();
                          
                            a.add(7);
                            a.add(9);
                            a.add(5); 

তাহলে ইলিমেন্ট গুলোর , যা অর্ডার হবে , তা হলো ----  [7, 9, 5] , অর্থাৎ যে অর্ডারে আমি ইলিমেন্ট এড করবো , সেই অনুসারেই ইলিমেন্ট সেট হবে  LinkedHashSet কনটেইনারে ।

এখন আসি , TreeSet কনটেইনারে , এটা হুবুহু  HashSet এর মতোন , কিন্তু একটা ছোট মেজোর তফাত হলো , TreeSet কোনো  null ভ্যালু  রাখতে পারে না , যেখানে  TreeSet এ যেকোনো null ভ্যালু রাখতে পারে !! যেমন , প্রথমে  HashSet এর ক্ষেত্রে দেখি ---

                           a.add(7);
                           a.add(9);
                           a.add(5);
                           a.add(null);

তাহলে   HashSet এর ভেতরে যেভাবে ইলিমেন্ট গুলো  formed হয় , [null, 5 , 7, 9] কিন্তু , এটাই  TreeSet  এর ক্ষেত্রে হবে এরকম  null এড করা যাবে না !! তাহলে NullPointerException থ্রো করবে !! আর তাছাড়া , TreeSet এর সাথে  HashSet আর কোনো বলার মতো , কোনো তফাত নেই  !! আমাদের লিস্ট এর প্রায় সব মেথোডই এখানে ইউজ করতে পারবে , কিছু মেথোড ছাড়া !! যেমন , লিস্ট এর মতোন ইন্ডেক্স অনুযায়ী অ্যাকসেস করা যাবে না !! এখানে ইটারেটর ইউজ করতে হয় ,index  রিলেটেড কোনো মেথোড এখানে ইউজ করতে পারবো না  !!

যেমন , আমরা এখানে আগের মতো  get(index) মেথোড ইউজ করতে পারবো না , set(index,newValue) মেথোডও ইউজ করতে পারবো না ,এমনকি আমরা  list এর ক্ষেত্রে যে ,  a.remove(index); মেথোড ইউজ করেছি , এই ক্ষেত্রে আমাদের  index এর জায়গায় যে সংখ্যাটি ডিলিট করতে চাই , সেই সংখ্যা লিখে ডিলিট করতে হবে !! যেমন ধরি , উপরের  HashSet এ আমরা , 5  ডিলিট করতে চাই , তাহলে আমরা  a.remove(5); এইভাবে মেথোডটি ইউজ করবো !! তাহলে , আমাদের  HashSet টি হবে এরকম , [null, 7, 9] , অর্থাৎ  5 সংখ্যাটি ডিলিট হয়ে যাবে ।

আমরা একটা সেট কনটেইনার , আরো একটা সেট কনটেইনার এর সমান কি না ? তা চেক করা যায় , ধরো ,  HashSet( a) এর উপাদান গুলো -- [5 , 7, 9] , LinkedHashSet(b) এর উপাদান গুলো -- [7, 9, 5]  তাহলে , a.equals(b) মেথোডটি  true রিটার্ন করবে !! কারণ , যে অর্ডার এই থাকুক না কেনো ? ইলিমেন্টগুলো একই আছে !! এই  equals মেথোডটি লিস্ট এর ভেতরেও ইমপ্লিমেন্ট সম্ভব , কিন্তু ভুলে উপরে উল্লেখ করা হয় নি !!

আর সবশেষে একটা কথা , সেট কনটেইনার এ লিস্ট এর কিছু index রিলেটেড মেথোড বাদে , সবই ইউজ করা যায় । তাই , এই  ArrayList ,Vector , LinkedList , Stack ,HashSet , LinkedHashSet ,TreeSet ইত্যাদির যেকোনো একটার মেথোদ ভালোভাবে ইউজ করা জানা থাকলে , বাকিগুলোও অনায়াসেই ইউজ করা সম্ভব !!

আপাতত এই ছোট্ট আলোচনা এখানেই শেষ !!


                                            String  সমাজ
                                     --------------------------


    size ------------ একটা  String এর  , সাইজ জানার অন্য   length() মেথোড ইউজ করা হয় !!

    index -----------  আমরা এখানে সি প্লাস প্লাস এর মতোন একটা স্ট্রিং এর ক্যারেক্টার  s[index] এভাবে প্রিন্ট করতে পারি না , এখানে s.charAt(index) লিখতে হয়  !!  
   
    lowercase/ uppercase--------- একটা স্ট্রিং কে   lowercase বা   uppercase এ পরিণত যেভাবে করবো তা হলো ,   String s=s.toLowerCase();/ String        s=s.toUpperCase();  তাহলেই কাজ হয়ে যাবে !!
                 
                                       IndexOf() ------>                   

 একটি ক্যার (char c)  String s এর ভেতরে কততম ইন্ডেক্সে আছে ? সেটা জানতে হলে ,int index=s.IndexOf(c);করে আমরা জানতে পারবো ,  c প্রথম কততম  index এ আছে ?

এখন আমরা যদি বলি, একটা নির্দিষ্ট  ইন্ডেক্স এর পর সেই ক্যারেক্টারটি কততম  index এ আছে  ? তাহলে , int index=s.IndexOf(c,2); এভাবে ব্যবহার করতে পারি !! এর মানে ,  s এর ভেতরে  2 নং    index অথবা তার পর থেকে একদম শেষ অবদি , c প্রথম কোন    index এ থাকে ?           

অনুরুপভাবে ,অন্য একটা  স্ট্রিং কি - এর ভেতরে থাকবে ? থাকলে , কততম ইন্ডেক্স এ আছে ? বা একটা নির্দিষ্ট ইন্ডেক্স এর পর কততম তে আছে ? এটা হুবহু আগের দুই মেথোডের মতো করেই ইউজ করা যাবে , শুধু ক্যারেক্টার এর জায়গায় যেকোনো স্ট্রিং বসাতে হবে  !!

    Equal ---------  দুটি স্ট্রিং সমান কি না ? তা চেক করাতে হলে , string1.equals(string2); মেথোড ইউজ করতে হবে , সমান হলে  true or false রিটার্ন করবে , সি             প্লাস প্লাস এর মতোন  if(string1==string2) ব্যবহার না করাই উত্তম , যদি দুইটি স্ট্রিং সমান হয় বাট শুধু কেইস ভিন্ন হয় তাহলে    string1.equalsIgnoreCase(string2)        মেথোড আমরা ইউজ করতে পারি  , তাহলে  lowercase/ uppercase কে আলাদা করে দেখবে না মেথোডটি  !!

    Contain--------- একটা স্ট্রিং আরেকটা স্ট্রিং এর ভেতরে আছে নাকি ? নাই ? s.contains(s2) এর মানে হলো , s2 স্ট্রিং'টি  s স্ট্রিং এর ভেতরে আছে নাকি নাই ? যদি থাকে , তাহলে
    true আর না হলে  false রিটার্ন করবে এই মেথোড টি ।

    Replace --------- আমাদের এই ফাংশনটার বেশ একটা গুরুত্বপূর্ণ একটা মেথোড হচ্ছে , এই মেথোডের মাধ্যমে , আমরা একটা স্ট্রিং এর কিছু  অংশ/ক্যারেক্টার  চেইঞ্জ করে অন্য কিছু রিপ্লেইস            করতে পারি , যেমন একটা উদাহরণ দেখে নেই
                               String s="Shamim is a good boy , Shamim is a good friend";
    
                                     s=s.replace("Shamim", "joy");

                             এর মানে , এই স্ট্রিং  s এ যত জায়গায়  Shamim থাকবে , সব চেইঞ্জ হয়ে  joy বসবে , চলো , এটা এখন প্রিন্ট করলে , কি হয় ? দেখি !!
                                     "joy is a good boy , joy is a good friend"
           

    Trim----- কোনো একটা স্ট্রিং এর শুরুতে বা শেষে , স্পেইস থাকলে সব স্পেইস রিমুভ করে দেয় , এই মেথোড । কিন্তু, স্ট্রিং এর মাঝে কোনো স্পেইস থাকলে সেটা রিমুভ করে না ।
              যেমন ,   String s="    Shamim is a good boy ";
           s=s.trim();
        তাহলে , এখানে স্ট্রিং এর শুরুতেও এবং শেষেও স্পেইস আছে , এখন  trim ইউজ করলে শুরুর ও শেষের স্পেইস রিমুভ হয়ে যাবে নতুন্সট্রিং হবে , "Shamim is a good boy" !!

    split --------- এই মেথোডের মাধ্যমে , আমরা বেশ কিছু জিনিস ভিত্তিক একটা স্ট্রিংকে আলাদা করতে পারবো , যেমন "java string split method by javatpoint"এই           স্ট্রিং কে যদি    খালি স্পেইস অনুযায়ী  split  করি , তাহলে আমরা শুধু শব্দ গুলো আলাদা করে পাবো !! যেমন, String[] words=s1.split("\\s");এখন এই words এর যতো           ইলিমেন্ট  গুলো পাবো    java
                  string
                  split
                  method
                  by
                  javatpoint