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

  Good becomes great, bad becomes worse. A strong man who has known power all his life can lose respect for that power, but a weak man knows the value of strength and knows compression

উইন্ডোজ এর Diskpart এর কিছু কমান্ড নিয়ে কাজ করা

অনেক সময় দেখা যায় যে উইন্ডোজ দেয়ার সময় আমরা আমাদের হার্ডডিস্ক কে গুই ব্যবহার করে আমাদের প্রয়োজন অনুসারে ভাগ করতে পারি না । সেই ক্ষেত্রে আমারা যদি ডিস্কপার্ট সফটওয়্যার টি ব্যাবহার করি তবে সহজেই সেটা করতে পারব ।  উইন্ডোজ দেয়ার সময় যখন Install Windows অপশন আসে তখন আমারা যদি Shift + F10 চাপি তবে উইন্ডোজ এর কমান্ড লাইন চলে আসবে । সেখানে যদি আমরা diskpart লিখলেই diskpart ওপেন হবে । এখানে আমরা ডিস্কপার্ট এর বিভিন্ন কমান্ড ব্যাবহার করতে পারব ।     এখন দেখব ডিস্কপার্ট এর বিভিন্ন কমান্ড কিভাবে ব্যাবহার করা যায় ।  আমার কয়টা হার্ড ডিস্ক আছে আছে সেটা দেখার জন্য list disk লিস্ট থেকে কোন একটা হার্ডডিস্ক কে সিলেক্ট করার জন্য  select Disk 0; ডিস্ক ০ কে সিলেক্ট করবে সিলেক্ট করা হার্ড ডিস্ক এর আন্ডারে কয়টা পার্টিশন আছে সেটা দেখার জন্য list partition primary partition ক্রিয়েট করার জন্য কমান্ড  create partition primary size = sss    এটার ড্রাইভ লেটার দেয়ার জন্য লিখতে হবে assign letter = 'D' এটা কে ntfs এ ফরমেট করার জন্য ল...