List, Tuple, এবং Map in Elixir (লিস্ট, টুপল এবং ম্যাপ)
Elixir তে বিভিন্ন ধরনের ডেটা স্ট্রাকচার রয়েছে, যার মধ্যে লিস্ট (List), টুপল (Tuple) এবং ম্যাপ (Map) সবচেয়ে বেশি ব্যবহৃত হয়। এই ডেটা স্ট্রাকচারগুলির প্রতিটির নিজস্ব বৈশিষ্ট্য এবং ব্যবহার রয়েছে, এবং তারা ডেটা পরিচালনা করার জন্য উপযুক্ত। নিচে এই ডেটা স্ট্রাকচারগুলির বিস্তারিত আলোচনা করা হয়েছে।
১. List (লিস্ট)
List Elixir তে একটি মৌলিক ডেটা স্ট্রাকচার যা ক্রমবদ্ধ (ordered) উপাদান ধারণ করে। লিস্টের মধ্যে উপাদানগুলির অবস্থান গুরুত্বপূর্ণ এবং একাধিক ভিন্ন ধরনের ডেটা ধারণ করা যেতে পারে।
লিস্টের বৈশিষ্ট্য:
- লিস্টে উপাদানগুলি সিকোয়েন্সের মধ্যে থাকে এবং এগুলোর মধ্যে প্রাকৃতিক অর্ডার থাকে।
- লিস্টগুলো হেড (প্রথম উপাদান) এবং টেল (বাকি উপাদান) হিসেবে বিভক্ত থাকে।
লিস্ট তৈরি:
list = [1, 2, 3, 4]
names = ["Alice", "Bob", "Charlie"]এখানে দুটি লিস্ট তৈরি করা হয়েছে: একটি সংখ্যা দিয়ে এবং অন্যটি স্ট্রিং দিয়ে।
লিস্টের প্রথম উপাদান অ্যাক্সেস:
hd(list) # 1এখানে hd/1 ফাংশন লিস্টের প্রথম উপাদানটি রিটার্ন করে।
লিস্টের বাকি উপাদান অ্যাক্সেস:
tl(list) # [2, 3, 4]এখানে tl/1 ফাংশন লিস্টের বাকি উপাদানগুলি রিটার্ন করে।
লিস্টে নতুন উপাদান যোগ করা:
new_list = [0 | list] # [0, 1, 2, 3, 4]এখানে | অপারেটর ব্যবহার করে নতুন উপাদান যোগ করা হয়েছে।
লিস্টের যোগফল (Concatenation):
combined_list = [1, 2] ++ [3, 4] # [1, 2, 3, 4]এখানে ++ অপারেটর দ্বারা দুটি লিস্ট একত্রিত করা হয়েছে।
২. Tuple (টুপল)
Tuple Elixir তে একটি অপরিবর্তনীয় (immutable) ডেটা স্ট্রাকচার যা অর্ডার্ড উপাদান ধারণ করে। তবে লিস্টের তুলনায় টুপলগুলির মধ্যে উপাদান অ্যাক্সেস করা দ্রুত হয়, কারণ এটি নির্দিষ্ট আকারের হয় এবং এতে ইনডেক্সিং খুব সহজ।
টুপলের বৈশিষ্ট্য:
- টুপল একটি ফিক্সড আকারের (fixed-size) ডেটা স্ট্রাকচার, যার মানে একবার তৈরি হলে এর আকার পরিবর্তন করা যায় না।
- টুপল সাধারণত একাধিক উপাদান ধারণ করে, এবং এর মধ্যে উপাদানগুলির অবস্থান গুরুত্বপূর্ণ।
টুপল তৈরি:
tuple = {1, 2, 3, 4}
names = {"Alice", "Bob", "Charlie"}এখানে দুটি টুপল তৈরি করা হয়েছে: একটি সংখ্যা দিয়ে এবং অন্যটি স্ট্রিং দিয়ে।
টুপল থেকে উপাদান অ্যাক্সেস:
elem(tuple, 0) # 1এখানে elem/2 ফাংশন টুপলের নির্দিষ্ট ইনডেক্স থেকে উপাদান রিটার্ন করে। ইনডেক্স 0 থেকে শুরু হয়।
টুপল পরিবর্তন (অপরিবর্তনীয়):
tuple = {1, 2, 3}
# টুপল আপডেট করা যাবে না, কারণ টুপল অপরিবর্তনীয় (immutable)টুপল একবার তৈরি হলে, আপনি এর উপাদান পরিবর্তন করতে পারবেন না। আপনি যদি একটি নতুন টুপল তৈরি করতে চান, তবে আপনাকে একটি নতুন টুপল তৈরি করতে হবে।
৩. Map (ম্যাপ)
Map Elixir তে একটি গুরুত্বপূর্ণ ডেটা স্ট্রাকচার, যা কী-ভ্যালু পেয়ার ধারণ করে। ম্যাপগুলি আপনাকে ডেটার মধ্যে সম্পর্ক তৈরি করতে এবং সহজেই যে কোনো মান খুঁজে পেতে সহায়ক।
ম্যাপের বৈশিষ্ট্য:
- ম্যাপের মধ্যে কোনো নির্দিষ্ট অর্ডার নেই (unordered)। প্রতিটি কী (key) একটি ইউনিক ভ্যালু (value) নির্দেশ করে।
- ম্যাপগুলির মধ্যে কোনো ধরনের ডেটা (সংখ্যা, স্ট্রিং, বা অন্য কিছু) ব্যবহার করা যেতে পারে।
ম্যাপ তৈরি:
person = %{name: "Alice", age: 30}
address = %{street: "Main St", city: "New York"}এখানে person এবং address দুটি ম্যাপ তৈরি করা হয়েছে, যা কী-ভ্যালু পেয়ার ধারণ করছে।
ম্যাপ থেকে মান অ্যাক্সেস:
IO.puts(person[:name]) # "Alice"
IO.puts(person[:age]) # 30এখানে [:name] এবং [:age] ব্যবহার করে আপনি ম্যাপ থেকে মান অ্যাক্সেস করতে পারেন।
ম্যাপ আপডেট (অপরিবর্তনীয়):
updated_person = %{person | age: 31}এখানে | অপারেটর দ্বারা আপনি একটি নতুন ম্যাপ তৈরি করছেন, যেখানে age মানটি 31 করা হয়েছে।
ম্যাপের নতুন কী-ভ্যালু পেয়ার যোগ করা:
new_person = Map.put(person, :city, "London")এখানে Map.put/3 ফাংশন ব্যবহার করে :city কী এবং "London" ভ্যালু ম্যাপে যোগ করা হয়েছে।
৪. লিস্ট, টুপল এবং ম্যাপের মধ্যে পার্থক্য
| বৈশিষ্ট্য | List | Tuple | Map |
|---|---|---|---|
| স্ট্রাকচার | ক্রমবদ্ধ (ordered) | অপরিবর্তনীয় (fixed-size) | কী-ভ্যালু পেয়ার (unordered) |
| অপরিবর্তনীয়তা | Mutable (পরিবর্তনযোগ্য) | Immutable (অপরিবর্তনীয়) | Mutable (পরিবর্তনযোগ্য) |
| কর্মক্ষমতা | আইটেম অ্যাক্সেস ধীর (slow) | দ্রুত (fast) | দ্রুত (fast) |
| ব্যবহার | ডেটার সিকোয়েন্স রাখার জন্য | ফিক্সড আকারের ডেটা গ্রুপিং | কী-ভ্যালু পেয়ার এবং সম্পর্কিত ডেটা |
| উপাদান অ্যাক্সেস | hd/1, tl/1, Enum ফাংশন | elem/2 ফাংশন | map[key] বা Map.get/2 |
সারসংক্ষেপ
Elixir তে লিস্ট, টুপল এবং ম্যাপ হল তিনটি মৌলিক ডেটা স্ট্রাকচার যা বিভিন্ন প্রয়োজনে ব্যবহৃত হয়।
- লিস্ট সাধারণত ক্রমবদ্ধ উপাদান ধারণ করে এবং এর মধ্যে বিভিন্ন ডেটা টাইপ থাকতে পারে।
- টুপল একটি অপরিবর্তনীয় (immutable) ডেটা স্ট্রাকচার যা দ্রুত অ্যাক্সেসের জন্য উপযুক্ত।
- ম্যাপ হল কী-ভ্যালু পেয়ার ভিত্তিক ডেটা স্ট্রাকচার, যা সম্পর্কিত ডেটা ধারণ করতে ব্যবহৃত হয়।
এই তিনটি ডেটা স্ট্রাকচার Elixir এর শক্তিশালী কোডিং অভিজ্ঞতা প্রদান করে, এবং বিভিন্ন পরিস্থিতিতে আপনি তাদের সুবিধা নিতে পারবেন।
Elixir: Lists এবং Tuples এর মৌলিক ধারণা
Lists এবং Tuples হল Elixir তে ব্যবহৃত দুটি গুরুত্বপূর্ণ ডেটা স্ট্রাকচার যা ডেটা সংরক্ষণের জন্য ব্যবহৃত হয়। যদিও উভয়েই ডেটা সংরক্ষণ করে, তাদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে। নিচে Lists এবং Tuples এর মৌলিক ধারণা এবং ব্যবহারের সম্পর্কে আলোচনা করা হলো।
1. Lists
Lists হল একটি অর্ডারড ডেটা স্ট্রাকচার যেখানে একাধিক উপাদান থাকে। Elixir তে Lists খুবই সাধারণ এবং শক্তিশালী ডেটা স্ট্রাকচার, যা উপাদানগুলির একটি সংগ্রহ (collection) হিসেবে কাজ করে। Lists তে উপাদানগুলো order (ক্রম) অনুসারে থাকে এবং এটি mutable নয়, অর্থাৎ একবার একটি লিস্ট তৈরি হলে তা পরিবর্তন করা সম্ভব নয়, তবে নতুন উপাদান যোগ করতে পারি।
List এর সিনট্যাক্স:
list = [1, 2, 3, 4]এখানে, [1, 2, 3, 4] একটি লিস্ট যেখানে ৪টি উপাদান আছে।
List এর বৈশিষ্ট্য:
- অর্ডারড ডেটা: Lists তে উপাদানগুলি order বা ক্রম অনুসারে থাকে।
- ডাইনামিক সাইজ: লিস্টের সাইজ ডাইনামিক, অর্থাৎ আপনি যত খুশি উপাদান যোগ করতে পারবেন।
হেড (head) এবং টেইল (tail): লিস্টের প্রথম উপাদানকে হেড এবং বাকি উপাদানগুলোকে টেইল বলে। Elixir তে লিস্টে হেড এবং টেইল আলাদা করা যায়।
[head | tail] = [1, 2, 3, 4] IO.puts(head) # আউটপুট হবে 1 IO.inspect(tail) # আউটপুট হবে [2, 3, 4]
List এর কিছু গুরুত্বপূর্ণ অপারেশন:
লিস্ট যোগ (Concatenation):
লিস্টের উপাদানগুলো যোগ করা যায়++অপারেটর দিয়ে:list1 = [1, 2] list2 = [3, 4] combined = list1 ++ list2 IO.inspect(combined) # আউটপুট হবে [1, 2, 3, 4]লিস্ট থেকে উপাদান মুছে ফেলা (Remove elements):
লিস্ট থেকে উপাদান সরানোর জন্য--অপারেটর ব্যবহার করা হয়:list = [1, 2, 3, 4] new_list = list -- [2] IO.inspect(new_list) # আউটপুট হবে [1, 3, 4]
2. Tuples
Tuples হল একটি অর্ডারড ডেটা স্ট্রাকচার, তবে লিস্টের তুলনায় এটি immutable (অপরিবর্তনীয়) এবং স্থির আকারের (fixed size) ডেটা স্ট্রাকচার। Tuples তে ডেটার উপাদানগুলো একটি নির্দিষ্ট ক্রমে সংরক্ষিত থাকে এবং এগুলো সাধারণত একত্রে কিছু সম্পর্কিত ডেটা রাখার জন্য ব্যবহৃত হয়। যেমন, একটি ত্রৈমাসিক রেটিং সিস্টেমে ব্যবহারকারী নাম, রেটিং এবং মন্তব্য একত্রে রাখতে Tuple ব্যবহার করা যেতে পারে।
Tuple এর সিনট্যাক্স:
tuple = {1, 2, 3, 4}এখানে, {1, 2, 3, 4} একটি Tuple যেখানে ৪টি উপাদান আছে।
Tuple এর বৈশিষ্ট্য:
- অর্ডারড ডেটা: Tuples তে উপাদানগুলি ক্রম অনুসারে থাকে, অর্থাৎ সেগুলির অবস্থান গুরুত্বপূর্ণ।
- immutable: একবার Tuple তৈরি হয়ে গেলে, তার মধ্যে কোনো উপাদান পরিবর্তন করা সম্ভব নয়।
- ফিক্সড সাইজ: Tuples এর আকার বা সাইজ নির্দিষ্ট থাকে। একবার Tuple তৈরি হয়ে গেলে, তার মধ্যে উপাদানের সংখ্যা পরিবর্তন করা যাবে না।
Tuple এর কিছু গুরুত্বপূর্ণ অপারেশন:
Tuples তৈরি এবং অ্যাক্সেস:
Tuple তৈরি করা হয়{}দিয়ে এবং উপাদানগুলোকে ইনডেক্সের মাধ্যমে অ্যাক্সেস করা যায়। তবে, Elixir তে Tuple-এর উপাদান সরাসরি ইনডেক্স করে অ্যাক্সেস করা যায় না, তবে আপনিelem/2ফাংশন ব্যবহার করে কোনো নির্দিষ্ট ইনডেক্সের মান পেতে পারেন।tuple = {1, 2, 3, 4} IO.puts(elem(tuple, 2)) # আউটপুট হবে 3Tuples এর আকার (Size):
tuple_size/1ফাংশন ব্যবহার করে একটি Tuple এর আকার পাওয়া যায়।tuple = {1, 2, 3, 4} IO.puts(tuple_size(tuple)) # আউটপুট হবে 4
Lists এবং Tuples এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Lists | Tuples |
|---|---|---|
| সাইজ | ডাইনামিক সাইজ, যেকোনো সময় পরিবর্তন করা যায় | ফিক্সড সাইজ, একবার তৈরি হলে পরিবর্তন করা যায় না |
| কনটেইনার টাইপ | হালকা (lightweight) | ভারী (heavier) |
| অ্যাক্সেস টাইপ | `head | tail` পদ্ধতিতে অ্যাক্সেস করা যায় |
| ব্যবহার | অনেক উপাদান একত্রে রাখার জন্য | সাধারণত একাধিক সম্পর্কিত মান একত্রে রাখার জন্য |
| পারফরম্যান্স | অধিক উপাদান হলে পারফরম্যান্স কিছুটা কম হতে পারে | ছোট আকারের ডেটা দ্রুত অ্যাক্সেস করা যায় |
সারসংক্ষেপ
- Lists: একটি ডাইনামিক এবং অর্ডারড ডেটা স্ট্রাকচার যা অনেক উপাদান ধারণ করতে সক্ষম। এটি
head | tailপদ্ধতিতে উপাদান অ্যাক্সেস এবং পরিবর্তন করতে সাহায্য করে। - Tuples: একটি অর্ডারড এবং immutable ডেটা স্ট্রাকচার যার আকার নির্দিষ্ট থাকে এবং এটি সাধারণত সম্পর্কিত ডেটা একত্রে রাখার জন্য ব্যবহৃত হয়।
Elixir তে Lists এবং Tuples উভয়েই গুরুত্বপূর্ণ ডেটা স্ট্রাকচার এবং এগুলি আলাদা আলাদা পরিস্থিতিতে ব্যবহৃত হয়। Lists বেশি উপাদান সংরক্ষণের জন্য উপযুক্ত, আর Tuples বেশি নির্দিষ্ট এবং কম উপাদান সংরক্ষণের জন্য উপযুক্ত।
Lists এবং Tuples এর সাথে Iteration এবং Manipulation in Elixir
Elixir একটি ফাংশনাল প্রোগ্রামিং ভাষা, এবং এখানে Lists এবং Tuples ডেটা স্ট্রাকচারগুলো খুবই গুরুত্বপূর্ণ। তাদের সাথে iteration এবং manipulation করার জন্য Elixir বেশ কিছু শক্তিশালী ফিচার এবং ফাংশন প্রদান করে। চলুন দেখি কীভাবে Lists এবং Tuples এর সাথে iteration এবং manipulation করা যায়।
Lists in Elixir
List হল Elixir তে একটি ডেটা স্ট্রাকচার যা একাধিক উপাদান (elements) ধারণ করে। এটি একটি লিনিয়ার ডেটা স্ট্রাকচার এবং একটি সিকোয়েন্স যা একটি নির্দিষ্ট অর্ডারে উপাদানগুলো সংরক্ষণ করে। Lists বেশ প্রভাবশালী ডেটা টাইপ, যেহেতু তাদের সাথে manipulation করা খুবই সহজ।
Iteration over Lists
Elixir তে List এর উপর iteration করার জন্য বেশ কিছু বিল্ট-ইন ফাংশন রয়েছে। এগুলোর মধ্যে সবচেয়ে জনপ্রিয় হল Enum.each/2, Enum.map/2, Enum.filter/2, **Enum.reduce/3**।
Examples of Iterating over Lists:
Enum.each/2: এটি একটি ফাংশন ব্যবহার করে লিস্টের প্রতিটি উপাদানকে প্রক্রিয়া করে।
list = [1, 2, 3, 4, 5]
Enum.each(list, fn x -> IO.puts(x) end)
# Output:
# 1
# 2
# 3
# 4
# 5Enum.map/2: এটি একটি ফাংশন ব্যবহার করে লিস্টের প্রতিটি উপাদান ট্রান্সফর্ম করে নতুন লিস্ট তৈরি করে।
list = [1, 2, 3, 4, 5]
new_list = Enum.map(list, fn x -> x * 2 end)
IO.inspect(new_list) # Output: [2, 4, 6, 8, 10]Enum.filter/2: এটি একটি ফাংশন ব্যবহার করে লিস্টের এমন উপাদানগুলো বেছে নেয় যা একটি নির্দিষ্ট শর্ত পূর্ণ করে।
list = [1, 2, 3, 4, 5]
filtered_list = Enum.filter(list, fn x -> rem(x, 2) == 0 end)
IO.inspect(filtered_list) # Output: [2, 4]Enum.reduce/3: এটি লিস্টের উপাদানগুলির উপর একটি একক মূল্য তৈরি করতে ব্যবহৃত হয়।
list = [1, 2, 3, 4, 5]
sum = Enum.reduce(list, 0, fn x, acc -> x + acc end)
IO.puts(sum) # Output: 15Manipulating Lists
List.append/2: দুটি লিস্ট একত্রিত করা।
list1 = [1, 2, 3]
list2 = [4, 5, 6]
merged_list = List.append(list1, list2)
IO.inspect(merged_list) # Output: [1, 2, 3, 4, 5, 6]List.delete/2: লিস্ট থেকে একটি উপাদান মুছে ফেলা।
list = [1, 2, 3, 4, 5]
new_list = List.delete(list, 3)
IO.inspect(new_list) # Output: [1, 2, 4, 5]List.insert_at/3: লিস্টে একটি নির্দিষ্ট অবস্থানে একটি উপাদান ইনসার্ট করা।
list = [1, 2, 3, 4]
new_list = List.insert_at(list, 2, 99)
IO.inspect(new_list) # Output: [1, 2, 99, 3, 4]Tuples in Elixir
Tuple Elixir তে এমন একটি ডেটা স্ট্রাকচার যা একাধিক উপাদান ধারণ করে, তবে এটি একটি স্থির ডেটা স্ট্রাকচার এবং এর আকার পরিবর্তন করা সম্ভব নয়। সাধারণত, Tuples ব্যবহার করা হয় এমন ডেটার জন্য যা পরিবর্তনযোগ্য নয় এবং প্রক্রিয়া করতে কিছু সঠিক কাঠামো প্রয়োজন।
Iteration over Tuples
Tuples এর মধ্যে iteration করার জন্য Elixir তে কোন সরাসরি Enum ফাংশন নেই, কারণ Tuples এর আকার পরিবর্তন করা সম্ভব নয়। তবে আপনি Tuple কে List তে কনভার্ট করে iteration করতে পারেন।
tuple = {:ok, 1, 2, 3}
# Convert tuple to list and iterate
tuple
|> Tuple.to_list()
|> Enum.each(fn x -> IO.puts(x) end)Manipulating Tuples
Tuples তে সরাসরি manipulation করা সম্ভব নয়, কিন্তু আপনি টিউপলকে List এ কনভার্ট করে সেই List এর সাথে কাজ করতে পারেন। তবে, আপনি টিউপল তৈরি বা নতুন উপাদান যুক্ত করতে পারেন।
Tuple.append/2: একটি নতুন উপাদান টিউপলে অ্যাপেন্ড করা।
tuple = {:ok, 1, 2}
new_tuple = Tuple.append(tuple, 3)
IO.inspect(new_tuple) # Output: {:ok, 1, 2, 3}Tuple.delete_at/2: টিউপল থেকে একটি উপাদান মুছে ফেলা।
tuple = {:ok, 1, 2, 3}
new_tuple = Tuple.delete_at(tuple, 2)
IO.inspect(new_tuple) # Output: {:ok, 1, 3}Tuple.insert_at/3: একটি নির্দিষ্ট ইনডেক্সে টিউপলে নতুন উপাদান ইনসার্ট করা।
tuple = {:ok, 1, 2}
new_tuple = Tuple.insert_at(tuple, 1, 99)
IO.inspect(new_tuple) # Output: {:ok, 99, 1, 2}Summary
| ডেটা স্ট্রাকচার | Iteration Function | Manipulation Function |
|---|---|---|
| List | Enum.each/2, Enum.map/2, Enum.filter/2, Enum.reduce/3 | List.append/2, List.delete/2, List.insert_at/3 |
| Tuple | Tuple.to_list/1 + Enum.each/2 | Tuple.append/2, Tuple.delete_at/2, Tuple.insert_at/3 |
Conclusion
- Lists Elixir তে খুবই গুরুত্বপূর্ণ ডেটা স্ট্রাকচার, এবং এগুলোর উপর iteration এবং manipulation করার জন্য
Enumফাংশনগুলি ব্যবহৃত হয়। - Tuples সাধারনত অবিচ্ছেদ্য (immutable) ডেটার জন্য ব্যবহৃত হয় এবং এগুলোর সাথে কাজ করার জন্য বেশ কিছু টিউপল ফাংশন প্রদান করা হয়। তবে, iteration করার জন্য টিউপলকে List তে কনভার্ট করতে হয়।
Map এবং Keyword List এর মধ্যে পার্থক্য
Elixir তে Map এবং Keyword List দুটোই ডেটা স্ট্রাকচার, যা কীগুলোর সাথে মান সংরক্ষণ করে, তবে তাদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে। এগুলোর ব্যবহার এবং উদ্দেশ্য আলাদা, এবং নির্দিষ্ট পরিস্থিতিতে এগুলোর মধ্যে কোনটি ব্যবহার করা উচিত তা বুঝতে পারা গুরুত্বপূর্ণ।
এখানে Map এবং Keyword List এর মধ্যে পার্থক্য আলোচনা করা হলো:
1. Map
Map হল একটি অর্ডারলেস ডেটা স্ট্রাকচার যা কী-ভ্যালু পেয়ার সংরক্ষণ করে। এটি Elixir তে ডাইনামিকভাবে কীগুলোর মান সংরক্ষণ এবং অ্যাক্সেস করার জন্য ব্যবহৃত হয়। Map এ আপনি যেকোনো ধরনের ডেটা (যেমন, স্ট্রিং, ইনটিজার, বুলিয়ান ইত্যাদি) কীগুলোর মান হিসেবে রাখতে পারেন।
Map এর বৈশিষ্ট্য:
- অর্ডারলেস: Maps তে কীগুলোর কোন নির্দিষ্ট অর্ডার থাকে না।
- কী-ভ্যালু পেয়ার: একে কীগুলোর মান হিসেবে কাজ করা হয়।
- উন্নত পারফরম্যান্স: Maps বড় ডেটার জন্য ব্যবহার করা যায় এবং এর অ্যাক্সেস গতি দ্রুত।
- ফাংশনাল অপারেশন: Maps তে ফাংশনাল অপারেশন যেমন কপি, আপডেট বা কন্টেইন চেক করা সহজ।
Map উদাহরণ:
# Map তৈরি করা
map = %{"name" => "Alice", "age" => 30}
# মান অ্যাক্সেস করা
IO.puts map["name"] # আউটপুট: Alice
IO.puts map["age"] # আউটপুট: 30
# নতুন কীগুলির মান যোগ করা
updated_map = Map.put(map, "city", "Dhaka")
IO.inspect(updated_map)
# আউটপুট: %{"name" => "Alice", "age" => 30, "city" => "Dhaka"}ম্যাপের সুবিধা:
- খুব বড় বা জটিল ডেটা সেটের জন্য উপযুক্ত।
- দ্রুত অ্যাক্সেস এবং আপডেটের জন্য অপ্টিমাইজড।
2. Keyword List
Keyword List হল একটি অর্ডারড তালিকা, যেখানে কীগুলোর মানগুলোর সাথে যুগল (tuple) হিসেবে যুক্ত থাকে। একটি Keyword List কে মূলত একটি লিস্ট হিসাবে দেখা হয়, যেখানে প্রতিটি কীগুলির মান একটি কী-ভ্যালু যুগলে থাকে এবং এর মধ্যে কীগুলির অর্ডার বজায় থাকে। Keyword List কে সাধারণত কনফিগারেশন বা অপশন প্যারামিটারগুলোতে ব্যবহার করা হয়।
Keyword List এর বৈশিষ্ট্য:
- অর্ডারড: Keyword List তে কীগুলোর সিকোয়েন্স বা অর্ডার বজায় থাকে।
- সিম্পল কী-ভ্যালু পেয়ার: এটি একটি তালিকা, যেখানে প্রতিটি কী-ভ্যালু যুগল (tuple) থাকে।
- একাধিক কপি থাকতে পারে: Keyword List এ একই কী একাধিক বার থাকতে পারে, যা Maps তে সম্ভব নয়।
Keyword List উদাহরণ:
# Keyword List তৈরি করা
keyword_list = [name: "Alice", age: 30, city: "Dhaka"]
# মান অ্যাক্সেস করা
IO.puts Keyword.get(keyword_list, :name) # আউটপুট: Alice
IO.puts Keyword.get(keyword_list, :age) # আউটপুট: 30
# একই কী একাধিক বার ব্যবহার করা
keyword_list_2 = [name: "Alice", name: "Bob"]
IO.inspect(keyword_list_2) # আউটপুট: [name: "Alice", name: "Bob"]কীওয়ার্ড লিস্টের সুবিধা:
- অর্ডার বজায় থাকে, তাই যখন আপনাকে একই কীগুলির মানের সাথে কাজ করতে হবে, তখন এটি খুবই কার্যকরী।
- সাধারণ কনফিগারেশন বা অপশন প্যারামিটারগুলি সংরক্ষণ করার জন্য এটি উপযুক্ত।
Map এবং Keyword List এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Map | Keyword List |
|---|---|---|
| অর্ডার | অর্ডারলেস | অর্ডারড |
| কী-ভ্যালু পেয়ার | একক কী-ভ্যালু পেয়ার (key-value pair) | একটি তালিকা, যেখানে কী-ভ্যালু যুগল থাকে |
| কী-ভ্যালু রিপিটেশন | একই কী একবারই থাকে | একাধিক বার একই কী থাকতে পারে |
| সিনট্যাক্স | %{"key" => value, "key2" => value2} | [:key1 => value1, :key2 => value2] |
| পারফরম্যান্স | বড় ডেটা বা ফাংশনাল অপারেশনগুলির জন্য দ্রুত | ছোট আকারের ডেটা, সাধারণত কনফিগারেশন এর জন্য |
| ফাংশনাল অপারেশন | সহজে মান আপডেট এবং ডেটার মধ্যে অ্যাক্সেস | সহজ এবং সোজা তালিকা অপারেশন |
| ব্যবহার | বড় ডেটা সেট, ডাইনামিক কনফিগারেশন | ছোট বা স্বল্প সংখ্যক কনফিগারেশন প্যারামিটার |
কোনটি কখন ব্যবহার করবেন?
- Map ব্যবহার করুন যখন আপনার ডেটা বড় এবং আপনার প্রয়োজনীয় কীগুলির মানের জন্য দ্রুত অ্যাক্সেস প্রয়োজন। এছাড়া, যখন আপনি একই কীগুলোর মান একাধিক বার রাখতে চান না, তখন Map ব্যবহার করা উচিত।
- Keyword List ব্যবহার করুন যখন আপনার ডেটা ছোট এবং কীগুলোর মানের অর্ডার গুরুত্বপূর্ণ। এটি সাধারণত কনফিগারেশন বা অপশন প্যারামিটার সংরক্ষণের জন্য উপযুক্ত, যেখানে কীগুলোর মানের মধ্যে একটি নির্দিষ্ট সিকোয়েন্স বজায় রাখা গুরুত্বপূর্ণ।
সারসংক্ষেপ
- Map হল একটি অর্ডারলেস ডেটা স্ট্রাকচার, যা কী-ভ্যালু পেয়ার সংরক্ষণ করে এবং ডেটার অ্যাক্সেস গতি দ্রুত।
- Keyword List হল একটি অর্ডারড তালিকা, যেখানে কী-ভ্যালু যুগল থাকে এবং আপনি একই কী একাধিক বার ব্যবহার করতে পারেন। এটি সাধারণত কনফিগারেশন এবং ছোট আকারের ডেটার জন্য ব্যবহার হয়।
Elixir তে Map এর বিভিন্ন অপারেশন (put, update, fetch)
Elixir তে Map একটি ডেটা স্ট্রাকচার, যা key-value জোড়া ধারণ করে। এটি একটি গুরুত্বপূর্ণ এবং খুবই ব্যবহৃত ডেটা স্ট্রাকচার, যা অর্ডার করা, অপরিবর্তনীয় (immutable) এবং সহজে কাস্টমাইজ করা যায়। Map এর মধ্যে বিভিন্ন অপারেশন করা যায়, যেমন put, update, এবং fetch। এই অপারেশনগুলো আপনাকে ম্যাপের মধ্যে মান (value) যোগ করা, পরিবর্তন করা এবং অ্যাক্সেস করার সুবিধা দেয়।
1. put/3 (Adding or Updating a Key-Value Pair)
put অপারেটরটি একটি নতুন কীগুচ্ছ (key-value pair) যোগ করতে বা পূর্বের মান (value) আপডেট করতে ব্যবহার করা হয়।
সিনট্যাক্স:
Map.put(map, key, value)- ব্যবহার:
এটি একটি নতুন ম্যাপ রিটার্ন করবে যেখানে নির্দিষ্ট কীগুচ্ছের মান যোগ করা হবে অথবা যদি সেই কীগুচ্ছ আগে থেকেই থাকে, তবে পুরানো মানটি নতুন মান দিয়ে আপডেট করা হবে।
উদাহরণ:
iex> map = %{a: 1, b: 2}
%{a: 1, b: 2}
iex> map = Map.put(map, :c, 3)
%{a: 1, b: 2, c: 3}
iex> map = Map.put(map, :b, 5)
%{a: 1, b: 5, c: 3}এখানে, Map.put(map, :c, 3) কীগুচ্ছ :c যোগ করেছে এবং Map.put(map, :b, 5) কীগুচ্ছ :b এর মান পরিবর্তন করেছে।
2. update/3 (Updating the Value of an Existing Key)
update অপারেটরটি একটি নির্দিষ্ট কীগুচ্ছের মানকে ফাংশন ব্যবহার করে আপডেট করে। এটি একটি ফাংশন নেয় যা পুরানো মানের উপর ভিত্তি করে নতুন মান তৈরি করে।
সিনট্যাক্স:
Map.update(map, key, default_value, fn current_value -> updated_value end)- ব্যবহার:
- যদি কীগুচ্ছটি উল্লেখিত না থাকে, তবে এটি ডিফল্ট মান (
default_value) ব্যবহার করবে। - যদি কীগুচ্ছটি থাকে, তবে এটি ফাংশন দিয়ে তার পুরানো মান আপডেট করবে।
- যদি কীগুচ্ছটি উল্লেখিত না থাকে, তবে এটি ডিফল্ট মান (
উদাহরণ:
iex> map = %{a: 1, b: 2, c: 3}
%{a: 1, b: 2, c: 3}
iex> Map.update(map, :b, 0, fn value -> value + 1 end)
%{a: 1, b: 3, c: 3}
iex> Map.update(map, :d, 0, fn value -> value + 1 end)
%{a: 1, b: 2, c: 3, d: 1}এখানে:
Map.update(map, :b, 0, fn value -> value + 1 end)কীগুচ্ছ:bএর মানকে ১ বাড়িয়েছে।Map.update(map, :d, 0, fn value -> value + 1 end)কীগুচ্ছ:dযা ছিল না, তাকে ০ দিয়ে শুরু করে এবং পরবর্তীতে তার মানকে ১ করে।
3. fetch/2 (Fetching the Value of a Key)
fetch অপারেটরটি একটি কীগুচ্ছের মান অ্যাক্সেস করতে ব্যবহৃত হয়। এটি একটি {:ok, value} টিউপল রিটার্ন করে যদি কীগুচ্ছটি পাওয়া যায়, এবং যদি কীগুচ্ছটি না থাকে তবে :error রিটার্ন করে।
সিনট্যাক্স:
Map.fetch(map, key)- ব্যবহার:
এটি কীগুচ্ছের মানটি খুঁজে বের করবে এবং একটি টিউপল রিটার্ন করবে, যার মধ্যে একদিকে:okএবং অন্যদিকে মান থাকবে যদি কীগুচ্ছটি পাওয়া যায়, অথবা:errorযদি কীগুচ্ছটি না থাকে।
উদাহরণ:
iex> map = %{a: 1, b: 2, c: 3}
%{a: 1, b: 2, c: 3}
iex> Map.fetch(map, :b)
{:ok, 2}
iex> Map.fetch(map, :d)
:errorএখানে:
Map.fetch(map, :b)কীগুচ্ছ:bএর মান2রিটার্ন করেছে।Map.fetch(map, :d)কীগুচ্ছ:dনা থাকার কারণে:errorরিটার্ন করেছে।
4. Other Useful Map Operations
Elixir তে Map এর সাথে আরও কিছু দরকারী অপারেশন রয়েছে:
a. get/2 (Fetch value by key)
get অপারেটরটি fetch এর মতো কাজ করে, তবে এটি টিউপল রিটার্ন করার পরিবর্তে সরাসরি nil রিটার্ন করে যদি কীগুচ্ছটি না থাকে।
iex> Map.get(map, :a)
1
iex> Map.get(map, :d)
nilb. delete/2 (Deleting a key-value pair)
delete অপারেটরটি একটি কীগুচ্ছ মুছে ফেলে।
iex> map = %{a: 1, b: 2, c: 3}
%{a: 1, b: 2, c: 3}
iex> map = Map.delete(map, :b)
%{a: 1, c: 3}এখানে, Map.delete(map, :b) কীগুচ্ছ :b কে মুছে ফেলেছে।
c. merge/2 (Merging two maps)
merge অপারেটরটি দুটি ম্যাপকে একত্রিত করে।
iex> map1 = %{a: 1, b: 2}
iex> map2 = %{c: 3, d: 4}
iex> Map.merge(map1, map2)
%{a: 1, b: 2, c: 3, d: 4}এখানে, দুটি ম্যাপ একত্রিত করা হয়েছে এবং নতুন একটি ম্যাপ তৈরি হয়েছে।
সারসংক্ষেপ
put/3: একটি নতুন কীগুচ্ছ (key-value pair) যোগ করতে বা পূর্বের মান আপডেট করতে ব্যবহৃত হয়।update/3: একটি কীগুচ্ছের মান ফাংশন ব্যবহার করে আপডেট করতে ব্যবহৃত হয়।fetch/2: একটি কীগুচ্ছের মান অ্যাক্সেস করতে ব্যবহৃত হয়, যদি কীগুচ্ছটি থাকে তাহলে{:ok, value}রিটার্ন হয়, আর না থাকলে:errorরিটার্ন হয়।
এছাড়া, Map এর মধ্যে আরও অনেক অপারেশন রয়েছে, যেমন get/2, delete/2, merge/2 যা ম্যানিপুলেট করতে সাহায্য করে। Elixir তে Maps অনেক গুরুত্বপূর্ণ ডেটা স্ট্রাকচার হিসেবে কাজ করে এবং তার সাথে বিভিন্ন অপারেশনকে দক্ষভাবে পরিচালনা করা যায়।
Read more