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
     

No comments:

Post a Comment