Skip to main content

CPP তে map কে তার ভেলু অনুসারে কি ভাবে সর্ট করা যায় ।

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

সাধারণ ভাবে ম্যাপ কে তার ভেলু অনুসারে সর্ট করা যায় না । ম্যাপ কে তার value অনুসারে সর্ট করার জন্য প্রথমে ম্যাপ  এর সবগুলো element [ key, value ] কে একটা vector এ কপি করে রাখতে হবে । এবং আমাদের কে সেই vector কে সর্ট করতে হবে ।

মনে করি আমাদের এই রকম একটা ম্যাপ আছে এবং তার মধ্যে এই ভেলুগুলো আছে ।
1  
2
3
4
5
map <string, int> mp;

mp["ABC"] = 10;
mp["DEF"] = 9;
mp["GHI"] = 5;

ম্যাপের এই ডাটা গুলো কে আমরা একটা vector এ কপি করে রাখব ।
1  
2
3
4
5
6
vector <pair< string, int>> v;
for(auto it = mp.begin(); it != mp.end(); ++it) {
    v.push_back(*it);
    // or we can use 
    // v.push_back(make_pair(it->first, it->second)); 
}

আমাদের ম্যাপের যেহেতু key, value দুইটা ভালু থাকে তাই এই দুইটা কে রাখার জন্য vector এর pair ব্যবহার করেছি । এখন আমদের এই vector কে সর্ট করতে হবে তার pair এর ২য় element এর উপর ভিত্তি করে ।

আমরা যদি C++ এর sort() ফাংশন ব্যবহার করে vector কে সর্ট করি তবে এই ভাবে লিখি,
sort( v.begin(), v.end() )
কিন্তু আমাদের সর্ট করতে হবে যেভাবে আমরা বলে দিব সেই ভাবে তাই উপরে যেভাবে সর্ট ফাংশন লিখেছি সেই ভাবে সর্ট ফাংশন লিখলে আমরা যেভাবে চাচ্ছি সেই ভাবে সর্ট হবে না ।

আমরা কি ভাবে সর্ট করতে চাচ্ছি সেটা একটা compare ফাংশন লিখে আমাদের sort() ফাংশন কে বলে দিতে হবে যে আমরা এই ভাবে সর্ট করতে চাচ্ছি । তো compare ফাংশন টা লিখে ফেলি :)
1  
2
3
bool comp(const pair<string, int> &a, const pair <string, int> &b) {
    return a.second < b.second;
}

আমরা আমাদের comp ফাংশনে a, b নামে দুইটা ভালু পাঠায়া দিয়েছি । আমাদের vector টাইপ pair এর প্রথম টি হল ম্যাপের key এবং ২য় টি হল ম্যাপের value . আমরা যেহেতু ম্যাপ কে value অনুসারে সর্ট করতে চাই তাই আমরা  শর্ত হিসাবে  a.second < b.second দিয়েছি । 

এখন এই comp ফাংশন কে sort() ফাংশনের একটা প্যারামিটার হিসাবে পাঠাতে হবে এই ভাবে ,

sort(v.begin(), v.end(), comp)
এখন প্রিন্ট করা দেখার পালা ।
1  
2
3
for(int i = 0; i < v.size(); i++) {
    cout << v[i].first << " " << v[i].second << endl;
}

আউটপুট যদি এই রকম হয় তবে  সব ঠিক আছে :)
GHI 5
DEF 9
ABC 10

সম্পূর্ণ কোড :

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

bool comp(const pair<string, int> &a, const pair <string, int> &b) {
    return a.second < b.second;
}
int main()
{
    map <string, int> mp;

    mp["ABC"] = 10;
    mp["DEF"] = 9;
    mp["GHI"] = 5;

    // copy the map data into vector.
    vector <pair< string, int>> v;
    for(auto it = mp.begin(); it != mp.end(); ++it) {
        v.push_back(*it);
        // or we can use
        //v.push_back(make_pair(it->first, it->second));
    }
    // sort by 2nd element
    sort(v.begin(), v.end(), comp);

    for(int i = 0; i < v.size(); i++) {
        cout << v[i].first << " " << v[i].second << endl;
    }
    return 0;
}

আর একাটা বিষয় । ম্যাপ তো তার key এর উপর ভিত্তি করে ডাটা কে ছোট থেকে বড় আকারে সর্ট করে রাখে । কিন্তু আমাদের দরকার বড় থেকে ছোট আকারে সর্ট করে রাখবে । এই কাজ করার জন্য আমরা যখন ম্যাপ লিখব তখন এই ভাবে লিখতে হবে ।

map <int, string, greater<int> > mp;

কোড :
1
 2
 3
 4
 5
 6
 7
 8
 9
10
map <int, int, greater<int> > mp2;

  mp2[5] = 20;
  mp2[10] = 30;
  mp2[3] = 15;

  cout << "Sort map Descending order: " << endl;
  for(auto it = mp2.begin(); it != mp2.end(); it++) {
      cout << it->first << " " << it->second << endl;
  }

এইখানে আমরা ম্যাপ লিখার সময় greater<int> দিয়ে বলে দিচ্ছি আমাদের ম্যাপ টি বড় থেকে ছোট আকারে সর্ট হবে । 

হ্যাপি সি প্লাস প্লাসইং :D

Comments

Popular posts from this blog

উবুন্টুতে রুট পাসওয়ার্ড ভুলে তা রিকভার করার উপায় ।

যদি কেউ রুট পাসওয়ার্ড ভুলে যান তাহলে নিচের কাজ গুলো করে নতুন পাসওয়ার্ড সেট করতে পারবেন: প্রথমে পিসি রিস্টার্ট দিন । দিয়ে UP/DOWN করে kernel version সিলেক্ট করে e চাপুন । ব্ল্যাক Screen আসবে এবার একটা Space দিয়ে লিখুন “Single” [ Enter ] এরপর b চাপুন ফলাফল : লিনাক্সের Single user Mood এ চলে আসছেন । এখন লিখুন passwd root [ Enter ] এখন নতুন পাসওয়ার্ড খানা টাইপ করেন [ এন্টার ] আবার টাইপ করেন [ এন্টার ] কাজ শেষ , এবার reboot টাইপ করেন । এখন নতুন পাসওয়ার্ড দিয়ে লগইন করেন। পুনশ্চ : যদি আপনার উইন্ডোজ এর সাথে ডুয়েল বুট করা থাকে তবে এই প্রক্রিয়া কাজ করবে না ।

Fix The BIOS in this system is not fully ACPI compliant in Windows 7

এই সমস্যা সমাধান করার জন্য আপনি নিচের ধাপ গুলো অনুসরণ করুন। ধাপ ১ :  আপানর  কম্পিউটার এ উইন্ডোজ এর ডিস্ক থেকে বুট করুন । নীচের মত উইন্ডো আসলে Shift + F10 চাপুন । এর ফলে কমান্ড প্রম্প্ট ওপেন হবে। ধাপ ২ : এখন CMD তে নিচের কমান্ড গুলি ধারবাহিক ভাবে লিখুন C: bootrec /FixMbr bootrec /FixBoot bootrec /RebuildBcd exit  এখানে  C হলো যে ড্রাইভ এ উইন্ডোজ দেয়া আছে।  আপনার যদি অন্য কোনো ড্রাইভ ( D, E, F, ..... ) এ উইন্ডোজ দেয়া থাকে তবে আপনাকে C এর জায়গায় সেই ড্রাইভ এর নাম লিখতে হবে।  উপরের সব কমান্ড যদি সঠিক ভাবে বিল্ড হয় তবে আপনি আপনার কম্পিউটার রিস্টার্ট দিন।  দেখবেন আপনার সমস্যা সমাধান হয়ে গেছে :D