ম্যাপ (Map) হল একটি ডেটা স্ট্রাকচার যা কীগুলির সাথে মান সংরক্ষণ করে। প্রতিটি কীগুলোর সাথে একটি নির্দিষ্ট মান সম্পর্কিত থাকে, এবং এটি সাধারণত কী-ভ্যালু পেয়ার (key-value pair) হিসেবে কাজ করে। ম্যাপগুলি এক ধরনের অ্যাসোসিয়েটিভ অ্যারে (associative array) হিসাবে কাজ করে যেখানে প্রতিটি কীগুলি একমাত্র মানের সাথে যুক্ত থাকে।
স্কালায় ম্যাপ দুটি প্রধান ধরনের হয়ে থাকে: ইমিউটেবল (Immutable) Map এবং মিউটেবল (Mutable) Map।
ম্যাপস এর বৈশিষ্ট্য
১. কী-ভ্যালু পেয়ার: একটি ম্যাপে প্রতিটি কীগুলির সাথে একটি নির্দিষ্ট মান (value) যুক্ত থাকে। উদাহরণস্বরূপ, একটি ম্যাপে ছাত্রের নামের সাথে তাদের রোল নম্বর বা গ্রেড সংরক্ষণ করা হতে পারে।
২. অর্ডারড/আনঅর্ডারড: স্কালার ম্যাপগুলির মধ্যে অর্ডারিংয়ের ধারণা থাকে না (যতটুকু না অন্য কোন প্রকার অনুসরণ করা হয়)। কিন্তু কিছু ম্যাপ, যেমন LinkedHashMap, অর্ডারড থাকে এবং কীগুলির ইনসার্টশন অর্ডার অনুসরণ করে।
৩. ফাংশনাল অপারেশন: ম্যাপে কীগুলির সাথে মান সম্পর্কিত অপারেশন যেমন get, put, remove, keys, values ইত্যাদি ব্যবহৃত হয়। ফাংশনাল অপারেশন যেমন map, filter, fold ইত্যাদি ম্যাপের উপর প্রয়োগ করা সম্ভব।
ইমিউটেবল (Immutable) ম্যাপ
ইমিউটেবল ম্যাপ হল এমন একটি ম্যাপ, যা একবার তৈরি হলে তার কীগুলোর মান পরিবর্তন করা যায় না। যদি কোনো নতুন মান যোগ বা মুছে ফেলতে চান, তবে একটি নতুন ম্যাপ তৈরি করতে হবে।
ইমিউটেবল ম্যাপের উদাহরণ:
val immutableMap = Map("a" -> 1, "b" -> 2, "c" -> 3)
println(immutableMap) // Map(a -> 1, b -> 2, c -> 3)
// কীগুলোর মান অ্যাক্সেস
println(immutableMap("b")) // 2
// নতুন মান যোগ করা
val updatedMap = immutableMap + ("d" -> 4)
println(updatedMap) // Map(a -> 1, b -> 2, c -> 3, d -> 4)মিউটেবল (Mutable) ম্যাপ
মিউটেবল ম্যাপ হল একটি ম্যাপ, যেখানে আপনি কীগুলোর মান পরিবর্তন, যোগ বা মুছে ফেলতে পারেন। মিউটেবল ম্যাপ ব্যবহার করলে কীগুলোর মানকে সরাসরি পরিবর্তন করা সম্ভব।
মিউটেবল ম্যাপের উদাহরণ:
import scala.collection.mutable.Map
val mutableMap = Map("a" -> 1, "b" -> 2, "c" -> 3)
println(mutableMap) // Map(a -> 1, b -> 2, c -> 3)
// কীগুলোর মান পরিবর্তন করা
mutableMap("b") = 5
println(mutableMap) // Map(a -> 1, b -> 5, c -> 3)
// নতুন মান যোগ করা
mutableMap += ("d" -> 4)
println(mutableMap) // Map(a -> 1, b -> 5, c -> 3, d -> 4)
// মান মুছে ফেলা
mutableMap -= "a"
println(mutableMap) // Map(b -> 5, c -> 3, d -> 4)ম্যাপের ফাংশনাল অপারেশন
১. get: কীগুলোর মান অনুসন্ধান করা।
val map = Map("a" -> 1, "b" -> 2)
println(map.get("a")) // Some(1)
println(map.get("c")) // Nonekeys: ম্যাপের সব কীগুলি বের করা।val map = Map("a" -> 1, "b" -> 2) println(map.keys) // Set(a, b)values: ম্যাপের সব মান বের করা।val map = Map("a" -> 1, "b" -> 2) println(map.values) // Collection(1, 2)map: ম্যাপের ওপর একটি ফাংশন প্রয়োগ করা।val map = Map("a" -> 1, "b" -> 2) val updatedMap = map.map { case (k, v) => (k, v * 2) } println(updatedMap) // Map(a -> 2, b -> 4)filter: নির্দিষ্ট শর্তে কীগুলির মান ফিল্টার করা।val map = Map("a" -> 1, "b" -> 2, "c" -> 3) val filteredMap = map.filter { case (k, v) => v > 1 } println(filteredMap) // Map(b -> 2, c -> 3)
ম্যাপের সুবিধা
১. কী-ভ্যালু সম্পর্ক: ম্যাপ একটি কীগুলির সাথে মানের সম্পর্ক স্থাপন করতে সহায়তা করে, যা ডেটা ম্যানিপুলেশন সহজ করে তোলে।
২. ফাংশনাল প্রোগ্রামিং সমর্থন: ম্যাপের উপর বিভিন্ন ফাংশনাল অপারেশন যেমন map, filter, fold, reduce প্রয়োগ করা সম্ভব, যা ডেটার কার্যকরী এবং সহজ প্রক্রিয়াকরণ নিশ্চিত করে।
৩. দ্রুত অ্যাক্সেস: ম্যাপ হ্যাশিং বা ট্রি স্ট্রাকচার ব্যবহার করে কাজ করে, যার ফলে কীগুলোর মান দ্রুত খোঁজা যায়।
সারাংশ
ম্যাপ একটি খুবই গুরুত্বপূর্ণ ডেটা স্ট্রাকচার যা কীগুলোর সাথে মান সংরক্ষণ করে। স্কালায় এটি দুটি ধরনের হয়ে থাকে — ইমিউটেবল ম্যাপ এবং মিউটেবল ম্যাপ। ম্যাপের মাধ্যমে ডেটাকে খুব কার্যকরভাবে পরিচালনা করা যায়, যেখানে কীগুলির সঙ্গে মানের সম্পর্ক থাকে এবং আপনি বিভিন্ন ফাংশনাল অপারেশন প্রয়োগ করতে পারেন।
স্কালায় Map একটি ডেটা স্ট্রাকচার যা কীগুলোর সাথে মান সংরক্ষণ করে, অর্থাৎ প্রতিটি কীগুলোর জন্য একটি নির্দিষ্ট মান থাকে। Immutable Map এবং Mutable Map এর মধ্যে প্রধান পার্থক্য হলো ডেটার পরিবর্তনযোগ্যতা (mutability)। চলুন, এই দুটি ম্যাপের মধ্যে পার্থক্য এবং তাদের ব্যবহার বিস্তারিতভাবে দেখি।
১. Immutable Map (ইমিউটেবল ম্যাপ)
Immutable Map হলো একটি ম্যাপ যেখানে একবার সেট করা কীগুলোর মান পরিবর্তন করা যায় না। অর্থাৎ, আপনি যদি একটি ইমিউটেবল ম্যাপে কোনো কীগুলোর মান পরিবর্তন করতে চান, তবে আপনাকে একটি নতুন ম্যাপ তৈরি করতে হবে। এটি প্রোগ্রামিংয়ের সুরক্ষা ও থ্রেড সেফটি নিশ্চিত করতে সহায়ক।
ইমিউটেবল ম্যাপের বৈশিষ্ট্য:
- পরিবর্তনযোগ্য নয়: একবার তৈরি হলে, ইমিউটেবল ম্যাপে কোনো কীগুলোর মান পরিবর্তন করা যায় না।
- থ্রেড সেফ: একাধিক থ্রেড একসাথে ব্যবহার করতে পারবে, কারণ ডেটা অপরিবর্তনীয়।
- ফাংশনাল প্রোগ্রামিং: ইমিউটেবল ম্যাপ ফাংশনাল প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ ধারণা, যেখানে ডেটাকে পরিবর্তন না করে নতুন ডেটা তৈরি করা হয়।
স্কালায় ইমিউটেবল ম্যাপ তৈরি করা:
val immutableMap = Map("apple" -> 3, "banana" -> 5, "cherry" -> 2)এখানে, Map("apple" -> 3, "banana" -> 5, "cherry" -> 2) একটি নতুন ইমিউটেবল ম্যাপ তৈরি করেছে, যেখানে কীগুলোর মান নির্ধারিত আছে।
ইমিউটেবল ম্যাপের মান অ্যাক্সেস:
println(immutableMap("apple")) // আউটপুট: 3এখানে, immutableMap("apple") কীগুলোর মান অ্যাক্সেস করছে, যেখানে "apple" এর মান ৩।
২. Mutable Map (মিউটেবল ম্যাপ)
Mutable Map হলো একটি ম্যাপ যেখানে আপনি কীগুলোর মান পরিবর্তন করতে পারেন, নতুন কীগুলোর মান যোগ বা পুরোনো কীগুলোর মান মুছে ফেলতে পারেন। এটি দ্রুত পরিবর্তন এবং ডেটা ম্যানিপুলেশন করতে সহায়ক। তবে এটি থ্রেড সেফ নয়, কারণ একাধিক থ্রেডের মধ্যে এটি পরিবর্তনযোগ্য।
মিউটেবল ম্যাপের বৈশিষ্ট্য:
- পরিবর্তনযোগ্য: কীগুলোর মান যোগ, পরিবর্তন বা মুছে ফেলা যায়।
- থ্রেড সেফ নয়: একাধিক থ্রেডের মধ্যে ব্যবহারে সতর্ক থাকতে হবে।
- পারফরম্যান্স: ডেটা পরিবর্তন দ্রুত ঘটে, কারণ এটি নতুন ম্যাপ তৈরি না করে সরাসরি কীগুলোর মান পরিবর্তন করে।
স্কালায় মিউটেবল ম্যাপ তৈরি করা:
import scala.collection.mutable
val mutableMap = mutable.Map("apple" -> 3, "banana" -> 5, "cherry" -> 2)এখানে, mutable.Map("apple" -> 3, "banana" -> 5, "cherry" -> 2) একটি নতুন মিউটেবল ম্যাপ তৈরি করেছে, যেখানে কীগুলোর মান পরিবর্তন করা যাবে।
মিউটেবল ম্যাপের মান অ্যাক্সেস এবং পরিবর্তন:
mutableMap("apple") = 4 // "apple" কীগুলোর মান পরিবর্তন করা
println(mutableMap("apple")) // আউটপুট: 4এখানে, mutableMap("apple") = 4 দ্বারা "apple" কীগুলোর মান ৩ থেকে ৪ এ পরিবর্তিত করা হয়েছে।
৩. Immutable এবং Mutable Maps এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Immutable Map | Mutable Map |
|---|---|---|
| পরিবর্তনযোগ্যতা | পরিবর্তন করা যায় না | পরিবর্তন করা যায় |
| থ্রেড সেফটি | হ্যাঁ, থ্রেড সেফ | না, থ্রেড সেফ নয় |
| পারফরম্যান্স | কম পারফরম্যান্স (কারণ নতুন ম্যাপ তৈরি হয়) | দ্রুত পারফরম্যান্স (কারণ সরাসরি পরিবর্তন করা হয়) |
| সাইড এফেক্ট | সাইড এফেক্ট কম | সাইড এফেক্ট বেশি (কারণ ডেটা পরিবর্তিত হয়) |
| ব্যবহার | নিরাপদ, ডেটা অপরিবর্তনীয় রাখতে ব্যবহার করা হয় | ডেটা পরিবর্তন করার জন্য ব্যবহৃত হয় |
সারাংশ
- Immutable Map একটি অপরিবর্তনীয় ম্যাপ যেখানে একবার তৈরি হলে কীগুলোর মান পরিবর্তন করা যায় না, এবং এটি থ্রেড সেফ।
- Mutable Map একটি পরিবর্তনযোগ্য ম্যাপ, যেখানে কীগুলোর মান যোগ বা মুছে ফেলা যায় এবং এটি দ্রুত পারফরম্যান্স প্রদান করে, তবে এটি থ্রেড সেফ নয়।
আপনার প্রয়োজন অনুযায়ী, আপনি ইমিউটেবল বা মিউটেবল ম্যাপ ব্যবহার করতে পারেন, যেখানে ইমিউটেবল ম্যাপ সুরক্ষা এবং থ্রেড সেফটি নিশ্চিত করে, এবং মিউটেবল ম্যাপ দ্রুত পরিবর্তন এবং ডেটা ম্যানিপুলেশন করার সুবিধা দেয়।
স্কালা কালেকশন ফ্রেমওয়ার্কে HashMap, ListMap, এবং TreeMap হল তিনটি গুরুত্বপূর্ণ Map টাইপের ডেটা স্ট্রাকচার। এই ম্যাপগুলির মধ্যে কিছু মৌলিক পার্থক্য রয়েছে, বিশেষ করে কিভাবে তারা উপাদানগুলি সংরক্ষণ করে এবং কীভাবে ডেটাকে অ্যাক্সেস করা হয়।
নিচে এই তিনটি ম্যাপের মধ্যে পার্থক্যগুলো আলোচনা করা হলো:
১. HashMap
HashMap হল একটি কনক্রিট ম্যাপ, যা কীগুলির সাথে মান সংরক্ষণ করতে ব্যবহৃত হয় এবং এটি হ্যাশিং (hashing) পদ্ধতি ব্যবহার করে। এর মানে হল যে এটি কীগুলির জন্য হ্যাশ কোড ব্যবহার করে, এবং এতে উপাদান অ্যাক্সেসের সময় দ্রুততার সাথে কাজ করা হয়। HashMap অর্ডার গ্যারান্টি দেয় না, অর্থাৎ সেটির উপাদানগুলি নির্দিষ্ট কোন অর্ডারে থাকে না।
বৈশিষ্ট্য:
- অর্ডার: কোনও নির্দিষ্ট অর্ডার থাকে না।
- পারফরম্যান্স: সাধারণত এটি উচ্চ পারফরম্যান্স প্রদান করে, কারণ এটি
O(1)সময় কমপ্লেক্সিটি দিয়ে ইনসার্ট, অনুসন্ধান এবং ডিলিট অপারেশন করে। - ব্যবহার: যখন ডেটা সন্নিবেশ বা খোঁজা দ্রুত করতে হয়, এবং অর্ডারের প্রয়োজন নেই।
উদাহরণ:
val hashMap = scala.collection.mutable.HashMap(1 -> "one", 2 -> "two", 3 -> "three")
println(hashMap) // HashMap(1 -> one, 2 -> two, 3 -> three)২. ListMap
ListMap একটি বিশেষ ধরনের ম্যাপ, যা লিনিয়ার লিস্ট-এর উপর ভিত্তি করে তৈরি এবং এটি ইমিউটেবল। এটি সন্নিবেশের অর্ডার রক্ষা করে, অর্থাৎ ম্যাপের উপাদানগুলি সন্নিবেশের অর্ডারে থাকে। ListMap সাধারণত ম্যাপের উপাদানগুলিকে সন্নিবেশের সময় অনুযায়ী সাজায়।
বৈশিষ্ট্য:
- অর্ডার: উপাদানগুলির সন্নিবেশের অর্ডার রক্ষা করা হয়।
- পারফরম্যান্স: তুলনামূলকভাবে কম পারফরম্যান্স হতে পারে, বিশেষত বড় ডেটাসেটে, কারণ
O(n)সময় কমপ্লেক্সিটিতে অনুসন্ধান করতে হয়। - ব্যবহার: যখন আপনি সন্নিবেশের অর্ডার রক্ষা করতে চান এবং ইনসার্ট ও অনুসন্ধান একসাথে দরকার হয় না।
উদাহরণ:
val listMap = scala.collection.immutable.ListMap(1 -> "one", 2 -> "two", 3 -> "three")
println(listMap) // ListMap(1 -> one, 2 -> two, 3 -> three)৩. TreeMap
TreeMap হল একটি অর্ডারড ম্যাপ, যা বিনারি সার্চ ট্রি (বিশেষত Red-Black Tree) ব্যবহার করে। এটি কীগুলিকে সজ্জিত করে এবং তাদের ক্রম অনুযায়ী উপাদানগুলো সাজায়। TreeMap কীগুলির জন্য কম্পেয়ার ফাংশন ব্যবহার করে (যেমন সংখ্যার জন্য স্বাভাবিক তুলনা, বা একটি কাস্টম কম্পেয়ার ফাংশন দেওয়া যায়)। এটি ইমিউটেবল এবং কীগুলোর অর্ডার রক্ষা করে।
বৈশিষ্ট্য:
- অর্ডার: কীগুলির অর্ডার বজায় রাখে (স্বাভাবিক ক্রম অথবা কাস্টম কম্পেয়ার ফাংশন অনুযায়ী)।
- পারফরম্যান্স: ইনসার্ট এবং অনুসন্ধান অপারেশনগুলির জন্য
O(log n)সময় কমপ্লেক্সিটি থাকে, কারণ এটি বাইনারি সার্চ ট্রি ভিত্তিক। - ব্যবহার: যখন কীগুলোর ক্রম অনুসারে সাজানোর প্রয়োজন হয় এবং ডেটার অর্ডার রক্ষা করা জরুরি হয়।
উদাহরণ:
val treeMap = scala.collection.immutable.TreeMap(3 -> "three", 1 -> "one", 2 -> "two")
println(treeMap) // TreeMap(1 -> one, 2 -> two, 3 -> three)পার্থক্য সংক্ষেপে
| বৈশিষ্ট্য | HashMap | ListMap | TreeMap |
|---|---|---|---|
| অর্ডার | অর্ডার গ্যারান্টি নেই | সন্নিবেশের অর্ডার রক্ষা করা হয় | কীগুলির ক্রম অনুযায়ী সাজানো হয় |
| পারফরম্যান্স | উচ্চ পারফরম্যান্স (O(1) অনুসন্ধান) | কম পারফরম্যান্স (O(n) অনুসন্ধান) | মাঝারি পারফরম্যান্স (O(log n) অনুসন্ধান) |
| ডেটা স্ট্রাকচার | হ্যাশিং | লিনিয়ার লিস্ট | বাইনারি সার্চ ট্রি |
| ব্যবহার | দ্রুত ডেটা অ্যাক্সেস এবং খোঁজ | সন্নিবেশের অর্ডার রক্ষা প্রয়োজন হলে | কীগুলির অর্ডার রক্ষা প্রয়োজন হলে |
সারাংশ
- HashMap ব্যবহার করা হয় যখন ডেটা দ্রুত অ্যাক্সেস করা প্রয়োজন এবং অর্ডার গুরুত্বপূর্ণ না হয়।
- ListMap ব্যবহার করা হয় যখন আপনি সন্নিবেশের অর্ডার রক্ষা করতে চান, তবে এটি বড় ডেটাসেটের জন্য খুব কার্যকর নয়।
- TreeMap ব্যবহার করা হয় যখন আপনি কীগুলির অর্ডার রক্ষা করতে চান এবং প্রয়োজনীয় ডেটার জন্য তুলনামূলক দ্রুত অনুসন্ধান চান।
Map একটি ডেটা স্ট্রাকচার যা কীগুলোর সাথে মান সংরক্ষণ করে। প্রতিটি কীগুলোর সাথে একটি নির্দিষ্ট মান (value) সংযুক্ত থাকে, এবং Map এ কীগুলির মানগুলোর প্রতি অ্যাক্সেস, অনুসন্ধান, যোগ বা মুছে ফেলার জন্য বিভিন্ন অপারেশন করা যায়। স্কালা (এবং অন্যান্য ভাষায়) Map ডেটা স্ট্রাকচারটির মাধ্যমে কীগুলির সাথে সম্পর্কিত মানগুলির ওপর বিভিন্ন মৌলিক অপারেশন করা যায়, যেমন: Addition, Removal, এবং Lookup।
১. Addition (যোগ করা)
Map-এ নতুন কীগুলোর সাথে মান যোগ করার জন্য আমরা সাধারণত += অথবা put() ফাংশন ব্যবহার করি। এটি নতুন কীগুলোর জন্য মান সেট করে বা পুরোনো কীগুলোর জন্য নতুন মান আপডেট করে।
স্কালায় Map-এ মান যোগ করা:
// একটি Map তৈরি
val map = scala.collection.mutable.Map(1 -> "Apple", 2 -> "Banana")
// নতুন কীগুলোর সাথে মান যোগ করা
map += (3 -> "Cherry") // কীগুলোর সাথে মান যোগ করা
println(map) // Output: Map(1 -> Apple, 2 -> Banana, 3 -> Cherry)এছাড়া, আপনি কীগুলোর মান পরিবর্তন বা আপডেট করতে put() মেথডও ব্যবহার করতে পারেন।
map.put(2, "Blueberry") // কীগুলোর মান পরিবর্তন করা
println(map) // Output: Map(1 -> Apple, 2 -> Blueberry, 3 -> Cherry)২. Removal (মুছে ফেলা)
Map থেকে একটি নির্দিষ্ট কী এবং তার সাথে সম্পর্কিত মান মুছে ফেলার জন্য -= অপারেটর অথবা remove() মেথড ব্যবহার করা হয়।
স্কালায় Map-এ উপাদান মুছে ফেলা:
// একটি Map তৈরি
val map = scala.collection.mutable.Map(1 -> "Apple", 2 -> "Banana", 3 -> "Cherry")
// নির্দিষ্ট কী মুছে ফেলা
map -= 2 // কী 2 এবং তার মান মুছে ফেলা
println(map) // Output: Map(1 -> Apple, 3 -> Cherry)
// বা remove() মেথড ব্যবহার করা
map.remove(3)
println(map) // Output: Map(1 -> Apple)এছাড়া, remove() মেথডটি সাধারণত একটি অপারেশন সম্পাদন করতে পারে এবং মুছে ফেলা কীটি সফলভাবে মুছে ফেলার পর Option ধরনের মান ফেরত দেয়।
val removedValue = map.remove(1)
println(removedValue) // Output: Some(Apple), মান সফলভাবে মুছে ফেলা হলে৩. Lookup (অনুসন্ধান)
Map-এর মধ্যে একটি নির্দিষ্ট কী এর মান খুঁজে বের করার জন্য get() মেথড ব্যবহার করা হয়। এটি ঐ কী এর জন্য মান প্রদান করবে যদি সেটি বিদ্যমান থাকে, অথবা None ফেরত দেবে যদি কীটি পাওয়া না যায়।
স্কালায় Map-এ মান অনুসন্ধান করা:
// একটি Map তৈরি
val map = scala.collection.mutable.Map(1 -> "Apple", 2 -> "Banana", 3 -> "Cherry")
// get() মেথড ব্যবহার করে কী অনুসন্ধান করা
val value = map.get(2)
println(value) // Output: Some(Banana), যদি কীটি পাওয়া যায়
// যদি কীটি পাওয়া না যায়
val missingValue = map.get(4)
println(missingValue) // Output: None, যদি কীটি না পাওয়া যায়আপনি যদি শুধু মানটি চেয়ে থাকেন এবং আপনি নিশ্চিত যে কীটি বিদ্যমান, তবে সরাসরি apply() ব্যবহার করতে পারেন:
val value = map(2)
println(value) // Output: Bananaএটি যদি কোনো কী না পায়, তবে একটি NoSuchElementException ফেলে দেয়।
সারাংশ
Map এ কীগুলির সাথে সম্পর্কিত মান যোগ, মুছে ফেলা, এবং অনুসন্ধান করার জন্য যে মৌলিক অপারেশনগুলো ব্যবহার করা হয়, তা হলো:
- Addition (যোগ করা):
+=বাput()ব্যবহার করে নতুন কী এবং মান যোগ করা। - Removal (মুছে ফেলা):
-=বাremove()ব্যবহার করে কোনো কী এবং তার মান মুছে ফেলা। - Lookup (অনুসন্ধান):
get()বাapply()ব্যবহার করে কোনো কী এর মান খুঁজে বের করা।
এই অপারেশনগুলো Map ডেটা স্ট্রাকচারের মৌলিক কার্যাবলী যা ডেটার উপর সহজে কাজ করতে সাহায্য করে।
স্কালায় কিওয়ে-ভ্যালু পেয়ারস সাধারণত Map ডেটা স্ট্রাকচার ব্যবহার করে কাজ করা হয়। Map হলো একটি ডেটা স্ট্রাকচার যা কীগুলোর সাথে সম্পর্কিত মান (value) সংরক্ষণ করে। এখানে প্রতিটি কীর সাথে একটি ভ্যালু যুক্ত থাকে, এবং আপনি কীগুলির মাধ্যমে মান অ্যাক্সেস করতে পারেন। স্কালার Map ডেটা স্ট্রাকচারটি খুবই শক্তিশালী এবং বিভিন্ন ফাংশনাল অপারেশন সমর্থন করে। এই অংশে আমরা কিওয়ে-ভ্যালু পেয়ারস নিয়ে কাজ করার বিভিন্ন কৌশল দেখব।
১. Map তৈরি করা (Creating a Map)
স্কালায় কিওয়ে-ভ্যালু পেয়ারস ধারণ করতে Map ব্যবহার করা হয়। একটি Map দুটি ধরনের হতে পারে:
- Immutable Map (ইমিউটেবল ম্যাপ)
- Mutable Map (মিউটেবল ম্যাপ)
Immutable Map
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)
println(map) // Output: Map(a -> 1, b -> 2, c -> 3)Mutable Map
import scala.collection.mutable.Map
val mutableMap = Map("a" -> 1, "b" -> 2)
mutableMap("c") = 3
println(mutableMap) // Output: Map(a -> 1, b -> 2, c -> 3)২. কী দিয়ে ভ্যালু অ্যাক্সেস করা (Accessing Value by Key)
Map-এর মধ্যে একটি নির্দিষ্ট কী দিয়ে আপনি মান অ্যাক্সেস করতে পারেন। এর জন্য আপনি কী ব্যবহার করে সরাসরি মান পেতে পারেন।
Immutable Map
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)
val value = map("a")
println(value) // Output: 1Mutable Map
val mutableMap = scala.collection.mutable.Map("a" -> 1, "b" -> 2)
mutableMap("a") = 10 // Update the value for key 'a'
println(mutableMap("a")) // Output: 10৩. get ব্যবহার করে মান পাওয়া (Using get to Retrieve Values)
get মেথডটি ব্যবহার করলে যদি কোনো কী-ভ্যালু পেয়ার না থাকে, তাহলে এটি None রিটার্ন করবে, যা Option টাইপ রিটার্ন করে। এটি ব্যবহারকারীর জন্য নিরাপদ, কারণ আপনি সহজেই নির্দিষ্ট কী’র মান না পাওয়া গেলে None-কে হ্যান্ডেল করতে পারবেন।
উদাহরণ:
val map = Map("a" -> 1, "b" -> 2)
val value = map.get("c") // Will return None as "c" is not in the map
println(value) // Output: None
val value2 = map.get("a") // Will return Some(1)
println(value2) // Output: Some(1)৪. keys এবং values ব্যবহার করা (Using keys and values)
keys: ম্যাপের সব কীগুলোর একটি সিকোয়েন্স প্রদান করে।values: ম্যাপের সব মানের একটি সিকোয়েন্স প্রদান করে।
উদাহরণ:
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)
println(map.keys) // Output: Set(a, b, c)
println(map.values) // Output: Iterable(1, 2, 3)৫. map ব্যবহার করে ম্যাপের উপর ফাংশন প্রয়োগ (Applying a Function on Map using map)
map মেথডের মাধ্যমে আপনি ম্যাপের সব কীগুলোর ওপর নির্দিষ্ট ফাংশন প্রয়োগ করতে পারেন এবং নতুন একটি ম্যাপ তৈরি করতে পারেন।
উদাহরণ:
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)
val doubledMap = map.map { case (key, value) => (key, value * 2) }
println(doubledMap) // Output: Map(a -> 2, b -> 4, c -> 6)৬. filter ব্যবহার করে কী-ভ্যালু ফিল্টার করা (Filtering Key-Value Pairs using filter)
filter মেথড ব্যবহার করে আপনি একটি নির্দিষ্ট শর্তের ভিত্তিতে কী-ভ্যালু পেয়ারগুলো ফিল্টার করতে পারেন।
উদাহরণ:
val map = Map("a" -> 1, "b" -> 2, "c" -> 3, "d" -> 4)
val filteredMap = map.filter { case (key, value) => value % 2 == 0 }
println(filteredMap) // Output: Map(b -> 2, d -> 4)৭. contains ব্যবহার করে কী চেক করা (Checking if a Key Exists using contains)
contains মেথড ব্যবহার করে আপনি চেক করতে পারেন কোনো কী ম্যাপের মধ্যে আছে কিনা।
উদাহরণ:
val map = Map("a" -> 1, "b" -> 2)
println(map.contains("a")) // Output: true
println(map.contains("c")) // Output: false৮. + এবং - ব্যবহার করে ম্যাপ আপডেট/মুছে ফেলা (Using + and - to Update and Remove Elements)
+: নতুন কী-ভ্যালু পেয়ার যুক্ত করতে ব্যবহৃত হয়।-: একটি কী সরানোর জন্য ব্যবহৃত হয়।
উদাহরণ:
val map = Map("a" -> 1, "b" -> 2)
val updatedMap = map + ("c" -> 3) // Add new key-value pair
println(updatedMap) // Output: Map(a -> 1, b -> 2, c -> 3)
val reducedMap = updatedMap - "a" // Remove key "a"
println(reducedMap) // Output: Map(b -> 2, c -> 3)৯. foreach ব্যবহার করে ম্যাপের উপাদান প্রক্রিয়া (Processing Map Elements using foreach)
foreach ব্যবহার করে আপনি ম্যাপের প্রতিটি কী-ভ্যালু পেয়ার প্রক্রিয়া করতে পারেন।
উদাহরণ:
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)
map.foreach { case (key, value) => println(s"Key: $key, Value: $value") }এই কোডের আউটপুট হবে:
Key: a, Value: 1
Key: b, Value: 2
Key: c, Value: 3সারাংশ
Mapডেটা স্ট্রাকচার কীগুলোর সাথে মান সংরক্ষণ করতে ব্যবহৃত হয়।getমেথড এবংcontainsমেথডের মাধ্যমে কীগুলির মান সহজে অ্যাক্সেস এবং চেক করা যায়।map,filter,+,-সহ বিভিন্ন ফাংশনাল অপারেশন ম্যাপের উপাদানগুলোর ওপর কার্যকরভাবে কাজ করতে সাহায্য করে।- স্কালায় কিওয়ে-ভ্যালু পেয়ারস ব্যবহারের মাধ্যমে ডেটার ম্যানিপুলেশন এবং প্রক্রিয়াকরণ অনেক সহজ এবং আরও দক্ষ হয়।
Read more