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

উবুন্টু তে Oracle SQL Developer ইন্সটল + এর সাথে MySQL Database Connecte করার উপায়

Oracle SQL Developer Tool Install করার জন্য আপনর  সিস্টেমে অবশ্যই জাভা - ৮ ইন্সটল করা থাকবে হবে । যদি জাভা - ৮  ইন্সটল করা না থাকে তবে  এই  লিঙ্ক  থেকে ইন্সটল করতে পারবেন । Part-1 : [ Install Oracle SQL Developer Tool ] উবুন্টুর জন্য Linux RPM  ফাইল টি ডাউনলোড করে নিন । এখন ডাউনলোড ফাইল টি Downloads ফোল্ডারে কপি করে রাখুন । এখন - Open Terminal (Ctrl + Alt + T) cd Downloads এখানে যদি আপনি ls command চালান তবে আপনি Downloads ফোল্ডারের আন্ডারে sqldeveloper_file_name.rpm নামে একটি .rpm ফাইল দেখতে পাবেন । এখন নিচের কমান্ড গুলা চালান  sudo apt-get install -y alien sudo alien --scripts sqldeveloper_file_name.rpm ২য় কমান্ডটি রান করলে .rpm ফাইল থেকে একটা .deb ফাইল জেনারেট হবে । এখন .deb ফাইলটি ইন্সটল করার জন্য এই কমান্ড রান করেন    sudo dpkg -i sqldeveloper_file_name.deb Part-2 : [ Connect to MySQL Database ] প্রথমে Connector/J  ডাউনলোড করে নিন । আপনি  Platform Independent ভার্সন ডাউনলোড করবেন । এখ...

[ UVa ] 10048 - Audiophobia

আমাকে কোন একটা শহরের একটা জায়গা থেকে অন্য একটা জায়গায় যেতে হবে । আমি বিভিন্ন রাস্তা ব্যাবহার করে আমার  কাঙ্ক্ষিত জায়গায় যেতে পারি । কিন্তু আমাকে এমন রাস্তা ব্যাবহার করে যেতে হবে যে রাস্তা দিয়ে গেলে আমাকে সবথেকে কম decibels এর শব্দ শুনতে হবে ।   এই সমস্যা টি সমাধান করার জন্য আমাদের কে  গ্রাফের ইনফরমেশন দেয়া হবে সেগুলো নিয়ে একটা Minimum Spanning Tree বানাতে হবে ।  এখন এই MST র উপর query করতে হলে আমাদের কে DFS/BFS চালাতে হবে ।  এইখান থেকে আমরা যে একটা নোড থেকে অন্য একটা নোডে যাওয়ার রাস্তা পাব তার মধ্যে খুজে দেখব কোন এজের ওয়েট সবথেকে বেশি । সেটাই আমাদের কে প্রিন্ট করেত হবে ।  যদি কোন রাস্তা না থাকে তবে no path প্রিন্ট করতে হবে ।  কোড : হ্যাপি কোডিং :)

Eclipse এ PyDev অফলাইনে কিভাবে ইন্সটল করা যায় ?

আমরা যদি Eclipse এ পাইথন ডেভেলপ করতে চাই তবে আমাদের PyDev ইন্সটল প্লাগিন ইন্সটল করা থাকতে হবে । PyDev ইন্সটল করার সবথেকে সহজে উপায় হল Eclipse এর Install New Software অপশন ব্যবহার করে ইন্সটল করা । কিন্তু এইটা মাঝে মাঝে সমস্যা হয় । কাজ করে না । এই জন্য আমরা PyDev প্লাগিন ম্যানুয়ালি ইন্সটল করতে পারব । এবং এটা করার জন্য আমরা যেটা করতে পারি সেটা হল : এই প্লাগিনের সর্বশেষ জিপ ভার্সন টি ডাউনলোড করুন  এখান থেকে জিপ ফাইল টি আনজিপ করুন । আনজিপ করলে আমরা features ও plugins নামে ২ ফাইল পাব  । এই ফাইল ২ টি কপি করে আমরা Eclipse সফটওয়্যারের dropins ফোল্ডারে পেস্ট করে দিব । এখন আমাদের Eclipse যদি চালু করা থাকে তবে Eclipse রিস্টার্ট দিব ।  আমাদের ইন্সটল ঠিক ভাবে হয়েছে কি না সেটা দেখার জন্য আমরা Window -> Preferences এ গিয়ে দেখব PyDev আছে কি না । যদি থাকে তবে এখন আপনি Eclipse এ পাইথনের জন্য কোড লিখতে পারবেন । ধন্যবাদ :)