ওহে! এই পাঠে, আমরা Java HashMap- এ একটি ঘনিষ্ঠ পর্যালোচনা করব । পূর্বে, আমরা ডেটা স্ট্রাকচারগুলি অধ্যয়ন করেছি যেখানে উপাদানগুলি নিজেদের হিসাবে সংরক্ষণ করা হয়। একটি অ্যারে বা একটি অ্যারেলিস্ট / লিঙ্কডলিস্টে , আমরা কিছু সংখ্যক উপাদান সংরক্ষণ করি। কিন্তু আমাদের কাজ যদি একটু পরিবর্তন হয়?
নিম্নলিখিত কাজটি কল্পনা করুন: 100 জনের একটি তালিকা তৈরি করুন যা প্রতিটি ব্যক্তির নাম এবং পাসপোর্ট নম্বর সংরক্ষণ করে। নীতিগতভাবে, এটি এত কঠিন নয়। উদাহরণস্বরূপ, আপনি একটি স্ট্রিং উভয় স্টাফ করতে পারেন, এবং তারপর এই স্ট্রিংগুলির একটি তালিকা তৈরি করতে পারেন: "Amelia Aguilar, 4211 717171"। কিন্তু এই সমাধান দুটি অপূর্ণতা আছে. প্রথমত, আমাদের পাসপোর্ট নম্বর দ্বারা অনুসন্ধান করার ক্ষমতা প্রয়োজন হতে পারে। এবং এই তথ্য স্টোরেজ বিন্যাস দেওয়া এই সমস্যাযুক্ত হবে. দ্বিতীয়ত, একই পাসপোর্ট নম্বর দিয়ে দুটি ভিন্ন ব্যক্তি তৈরি করা থেকে কিছুই আমাদের বাধা দেয় না। এবং এটি আমাদের সমাধানের সবচেয়ে গুরুতর ত্রুটি। এটি কখনই অনুমোদিত হওয়া উচিত নয়: কোনও দুই ব্যক্তির একই পাসপোর্ট নম্বর নেই। একটি নতুন ডেটা কাঠামো আমাদের সাহায্যে আসে: মানচিত্র. এটি একটি "অ্যাসোসিয়েটিভ অ্যারে" হিসাবেও পরিচিত, তবে এই শব্দটি কদাচিৎ ব্যবহৃত হয়। আরো সাধারণভাবে, এটি একটি "অভিধান" বা "মানচিত্র" বলা হয়। :) আমরা পূর্বে বিবেচনা করা ডেটা স্ট্রাকচারের চেয়ে এটি মৌলিকভাবে কীভাবে আলাদা? সর্বোপরি, একটি মানচিত্রের ডেটা মূল-মান জোড়া হিসাবে সংরক্ষণ করা হয়। যেকোনো কিছু কী এবং মান হিসেবে কাজ করতে পারে: সংখ্যা, স্ট্রিং বা অন্যান্য শ্রেণীর বস্তু। আজ আমরা মানচিত্র ক্লাসের সবচেয়ে সাধারণ বাস্তবায়ন অধ্যয়ন করব : Java HashMap ।
সুতরাং, জাভাতে হ্যাশম্যাপ সম্পর্কে আমাদের কী জানা দরকার?
এটি তৈরি করা খুব সহজ:
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
এখানে আমরা একটি অভিধান তৈরি করি যা উপাদানগুলিকে "সংখ্যা-স্ট্রিং" জোড়া হিসাবে সংরক্ষণ করে। সংখ্যাটি কী হিসাবে কাজ করবে এবং স্ট্রিংটি মান হিসাবে কাজ করবে। এছাড়াও আমরা কী টাইপ (Integer) এবং ভ্যালু টাইপ (String) উল্লেখ করি। কেন? প্রথমত, একটি হ্যাশম্যাপ কী সর্বদা অনন্য। এটি আমাদের জন্য পুরোপুরি উপযুক্ত, যেহেতু আমরা পাসপোর্ট নম্বরটিকে কী হিসাবে ব্যবহার করতে পারি এবং নকল এড়াতে পারি। মানটি সম্পূর্ণ নামের একটি স্ট্রিং হবে (বিভিন্ন লোকের একই নাম থাকতে পারে; এটি নিয়ে আমাদের উদ্বিগ্ন হওয়ার কিছু নেই)। হ্যাশম্যাপে একটি নতুন জোড়া যোগ করা এইরকম দেখাচ্ছে:
public class Main {
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put (212133, "Bridget Logan");
passportsAndNames.put (162348, "Ivan the Great");
passportsAndNames.put(8082771, "Donald John Trump");
System.out.println(passportsAndNames);
}
}
আমরা এর জন্য put() পদ্ধতি ব্যবহার করি । উপরন্তু, HashMap toString() পদ্ধতিকে ওভাররাইড করে , তাই এটি কনসোলে প্রদর্শিত হতে পারে। আউটপুটটি এরকম দেখাবে: {212133=ব্রিজেট লোগান, 8082771=ডোনাল্ড জন ট্রাম্প, 162348=ইভান দ্য গ্রেট} এখন আসুন যাচাই করা যাক কীগুলি সত্যিই অনন্য কিনা? আসুন একটি কী সহ একটি নতুন উপাদান যোগ করার চেষ্টা করি যা ইতিমধ্যে মানচিত্রে ব্যবহৃত হয়েছে :
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put (212133, "Bridget Logan");
passportsAndNames.put (162348, "Ivan the Great");
passportsAndNames.put(8082771, "Donald John Trump");
passportsAndNames.put(162348, "Albert Kent");// This key has already been used
System.out.println(passportsAndNames);
}
আউটপুট: {212133=ব্রিজেট লোগান, 8082771=ডোনাল্ড জন ট্রাম্প, 162348=আলবার্ট কেন্ট} আপনি দেখতে পাচ্ছেন, 162348 কী-এর সাথে যুক্ত আগের মানটি ওভাররাইট করা হয়েছে। আমরা একটি কারণে "কী" শব্দটি ব্যবহার করি। হ্যাশম্যাপের মানগুলি কী ব্যবহার করে অ্যাক্সেস করা হয়, তবে অন্যভাবে নয়। কী একটি মান ব্যবহার করে প্রাপ্ত করা যাবে না, যেহেতু মানগুলি অনন্য নাও হতে পারে। হ্যাশম্যাপ থেকে একটি উপাদান পাওয়ার বা সরানোর সময় এটি স্পষ্টভাবে দেখা যায় :
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put (212133, "Bridget Logan");
passportsAndNames.put (162348, "Ivan the Great");
passportsAndNames.put(8082771, "Donald John Trump");
String lidiaName = passportsAndNames.get(212133);
System.out.println(lidiaName);
passportsAndNames.remove(162348);
System.out.println(passportsAndNames);
}
একটি মান পেতে বা অভিধান থেকে একটি জোড়া অপসারণ করতে, আমাদের অবশ্যই get() এ পাস করতে হবে এবং মানের সাথে সামঞ্জস্যপূর্ণ অনন্য কীটি দূর করতে হবে । অ্যারে এবং তালিকার বিপরীতে, জাভাতে একটি হ্যাশম্যাপের কোনও সংখ্যাসূচক সূচক নেই: কী ব্যবহার করে মানগুলি অ্যাক্সেস করা হয়। কনসোল আউটপুট: ব্রিজেট লোগান {212133=ব্রিজেট লোগান, 8082771= ডোনাল্ড জন ট্রাম্প} অ্যারেলিস্ট এবং লিঙ্কডলিস্ট ক্লাস আমাদের পরীক্ষা করে দেখতে দিন যে তালিকাটিতে কোনো বিশেষ উপাদান রয়েছে কিনা। জাভা হ্যাশম্যাপ আমাদের এটি করতে দেয়। আরও কী, আমরা জোড়ার উভয় সদস্যের জন্য এটি করতে পারি: এটি হল containsKey () (একটি কী পরীক্ষা করে) এবং ধারণ করে মান()(একটি মান পরীক্ষা করে) পদ্ধতির জন্য।
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put (212133, "Bridget Logan");
passportsAndNames.put (162348, "Ivan the Great");
passportsAndNames.put(8082771, "Donald John Trump");
System.out.println(passportsAndNames.containsKey(11111));
System.out.println(passportsAndNames.containsValue("Donald John Trump"));
}
আউটপুট: মিথ্যা সত্য জাভাতে হ্যাশম্যাপের আরেকটি সুবিধাজনক বৈশিষ্ট্য হল যে আপনি সমস্ত কী এবং সমস্ত মানগুলির পৃথক তালিকা পেতে পারেন। এটি keySet() এবং values() পদ্ধতির মাধ্যমে সম্পন্ন করা হয়:
public class Main {
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put (212133, "Bridget Logan");
passportsAndNames.put (162348, "Ivan the Great");
passportsAndNames.put(8082771, "Donald John Trump");
Set keys = passportsAndNames.keySet();
System.out.println("Keys: " + keys);
ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
System.out.println("Values: " + values);
}
}
কীগুলি একটি সেটে বের করা হয় , যা আমরা এখনও কভার করিনি। এটা বিশেষ যে এটি পুনরাবৃত্তি উপাদান থাকতে পারে না. এখন মূল জিনিসটি মনে রাখা উচিত যে সমস্ত কীগুলির তালিকা একটি হ্যাশম্যাপ থেকে একটি পৃথক সংগ্রহে পুনরুদ্ধার করা যেতে পারে। উদাহরণে, আমরা একটি সাধারণ ArrayList- এ মানগুলি সংরক্ষণ করেছি । কনসোল আউটপুট: কী: [212133, 8082771, 162348] মান: [ব্রিজেট লোগান, ডোনাল্ড জন ট্রাম্প, ইভান দ্য গ্রেট] সাইজ () এবং ক্লিয়ার() পদ্ধতি ঠিক একই কাজ করে যা আমরা আলোচনা করেছি আগের কাঠামোর মতো: প্রথমটি অভিধানে বর্তমানে উপাদানের সংখ্যা প্রদান করে, দ্বিতীয়টি সমস্ত উপাদান সরিয়ে দেয়।
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put (212133, "Bridget Logan");
passportsAndNames.put (162348, "Ivan the Great");
passportsAndNames.put(8082771, "Donald John Trump");
System.out.println(passportsAndNames.size());
passportsAndNames.clear();
System.out.println(passportsAndNames);
}
আউটপুট: 3 {} আমাদের হ্যাশম্যাপে অন্তত একটি উপাদান আছে কিনা তা পরীক্ষা করতে , আমরা isEmpty() পদ্ধতি ব্যবহার করতে পারি:
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
passportsAndNames.put (212133, "Bridget Logan");
passportsAndNames.put (162348, "Ivan the Great");
passportsAndNames.put(8082771, "Donald John Trump");
if (!passportsAndNames.isEmpty()) {
System.out.println(passportsAndNames);
}
}
আউটপুট: {212133=ব্রিজেট লোগান, 8082771=ডোনাল্ড জন ট্রাম্প, 162348=ইভান দ্য গ্রেট} এখন আমরা প্রাথমিক চেক করার পরে শুধুমাত্র কনসোলে আউটপুট দেব। :) আরেকটি মজার বিষয় হল দুটি মানচিত্র একত্রিত করা যায়। এটি putAll() পদ্ধতি ব্যবহার করে সম্পন্ন হয়েছে। আমরা এটিকে প্রথম হ্যাশম্যাপে বলি , দ্বিতীয়টিকে একটি যুক্তি হিসাবে পাস করি এবং দ্বিতীয়টির উপাদানগুলি প্রথমটিতে যোগ করা হয়:
public static void main(String[] args) {
HashMap<Integer, String> passportsAndNames = new HashMap<>();
HashMap<Integer, String> passportsAndNames2 = new HashMap<>();
passportsAndNames.put (212133, "Bridget Logan");
passportsAndNames.put (162348, "Ivan the Great");
passportsAndNames.put(8082771, "Donald John Trump");
passportsAndNames2.put(917352, "Clifford Patrick");
passportsAndNames2.put(925648, "Mitchell Salgado");
passportsAndNames.putAll(passportsAndNames2);
System.out.println(passportsAndNames);
}
আউটপুট: {917352=ক্লিফোর্ড প্যাট্রিক, 212133=ব্রিজেট লোগান, 8082771=ডোনাল্ড জন ট্রাম্প, 925648=মিচেল সালগাডো, 162348=ইভান দ্য গ্রেট} পাসপোর্টের সমস্ত জোড়া এবং নাম 2 পাসপোর্টের নামে কপি করা হয়েছে । এখন একটি আরও জটিল উদাহরণ বিবেচনা করুন। বিশেষত, একটি লুপে হ্যাশম্যাপের উপর পুনরাবৃত্তি করা।
for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
System.out.println(entry);
}
Map.Entry ক্লাস ডিকশনারির ভিতরে কী-মান জোড়া নির্দেশ করে । entrySet () পদ্ধতি আমাদের হ্যাশম্যাপে সমস্ত জোড়ার একটি তালিকা প্রদান করে । কারণ আমাদের মানচিত্রে এই Map.Entry জোড়া নিয়ে গঠিত, আমরা জোড়ার উপর পুনরাবৃত্তি করছি, আলাদা কী বা মান নয়। আউটপুট: 212133=ব্রিজেট লোগান 8082771=ডোনাল্ড জন ট্রাম্প 162348=ইভান দ্য গ্রেট এছাড়াও, হ্যাশম্যাপের জন্য অফিসিয়াল ওরাকল ডকুমেন্টেশন অধ্যয়ন করতে ভুলবেন না ।
GO TO FULL VERSION