Avatar billede wolffbrix Nybegynder
21. maj 2003 - 12:28 Der er 5 kommentarer og
1 løsning

sorter en map

Hej,

Jeg har en map bestående af map<string, int> wordmap.

Hvordan får jeg soreteret den mht. int værdien?

Det skal være C++ style.
Avatar billede wolffbrix Nybegynder
21. maj 2003 - 12:29 #1
har prøvet med:

wordmap wm;
sort(wm.begin(), wm.end());

men det virkede ikke
Avatar billede soreno Praktikant
21. maj 2003 - 15:04 #2
En map er en (key, value) datastruktur (key kan kun forekomme én gang - den er unik). Den sorterer man ikke..

Hvad indeholder den ?
Avatar billede olennert Nybegynder
21. maj 2003 - 15:13 #3
Som soreno skriver sorterer man ikke en map. map bruges til hurtigt at slå data op ud fra en nøgle, og er sædvanligvis implementeret som en træstruktur. Men hvis du ønsker at sortere for at få ud i en bestemt rækkefølge, så smid elementerne over en en vector eller deqeue, og så sorter den.

Alternativt kan du køre med to maps, en map<string, int> og en map<int,string>. Så vil du få "sorteret" nogenlunde som du forventer (nogenlunde på grund af forskellen mellem ækvivalens og identitet). Men så må du altså også holde styr på to datastrukturer undervejs.

Det kunne måske være interessant at få en beskrivelse af hvad du gerne vil opnå? Så kan det være vi kan komme med en bedre løsning.
Avatar billede wolffbrix Nybegynder
21. maj 2003 - 17:56 #4
Jeg har indlæst en fil, og mappet alle ordene et efter et.
Ordene er mappet med deres tilhørende hyppighed.
Jeg skal nu have disse ord skrevet ud i sorteret rækkefølge.
Sorteret efter faldende hyppighed.

Jeg kan godt finde ud af skrive dem ud, men det bliver i alfabetisk rækkefølge, da key er ordet, og value er antal af forekomster.
Avatar billede soreno Praktikant
21. maj 2003 - 18:39 #5
Du kan putte dem i en prioritets kø..

Se f.eks.
#include <iostream>
#include <fstream>
#include <string>
#include <queue>
#include <map>

using namespace std;

typedef map<string, int> Map;
typedef Map::iterator MapIter;
typedef Map::const_iterator ConstMapIter;
typedef pair<int, string> PriorityQueuePair;
typedef priority_queue<PriorityQueuePair> PriorityQueue;

void insertWords(const string &filename, Map &words);
void generateFreq(const Map &words, PriorityQueue &priorityQueue);
void printFreq(PriorityQueue priorityQueue);

int main(int argc, char **argv)
{
    Map words;
    PriorityQueue priorityQueue;

    insertWords("test.txt", words);
    generateFreq(words, priorityQueue);
    printFreq(priorityQueue);

    return 0;
}

void insertWords(const string &filename, Map &words)
{
    ifstream file;
    file.open(filename.data());
    if(!file.is_open())
    {
        cout << "*error* - could not open file" << endl;
    }
    else
    {
        string input;
        string::iterator strIter;
        MapIter mapIter;

        while(file>>input)
        {
            for(strIter=input.begin();strIter!=input.end();strIter++)
            {
                *strIter = tolower(*strIter);
            }

            mapIter = words.find(input);
            if(mapIter == words.end())
                words.insert(make_pair(input, 1));
            else
                mapIter->second += 1;
        }
        file.close();
    }

}

void generateFreq(const Map &words, PriorityQueue &priorityQueue)
{
    ConstMapIter iter = words.begin();
    PriorityQueuePair tempPair;
    while(iter!=words.end())
    {
        tempPair.first = iter->second;
        tempPair.second = iter->first;
        priorityQueue.push(tempPair);
        iter++;
    }
}

//call-by-value since priorityQueue gets manipulated
void printFreq(PriorityQueue priorityQueue)
{
    cout << "Words sorted on frequency:" << endl;
    PriorityQueuePair temp;
    cout.setf(ios::fixed);

    while(!priorityQueue.empty())
    {
        temp = priorityQueue.top();
        priorityQueue.pop();
        cout.width(0);
        cout << "Freq: " << temp.first;
        cout.width(10);
        cout << "Word: " << temp.second;
        cout << endl;
    }
}

Skriver hos mig:
Words sorted on frequency:
Freq: 5    Word: er
Freq: 3    Word: der
Freq: 2    Word: tekst
Freq: 2    Word: som
Freq: 2    Word: ord
Freq: 2    Word: ikke
Freq: 2    Word: andre
Freq: 1    Word: tµlles
Freq: 1    Word: til
Freq: 1    Word: tegn
Freq: 1    Word: sorteres
Freq: 1    Word: skal
Freq: 1    Word: pÕ
Freq: 1    Word: punktum
Freq: 1    Word: ordhyppighed
Freq: 1    Word: og
Freq: 1    Word: nogle
Freq: 1    Word: lµse
Freq: 1    Word: lowcase
Freq: 1    Word: lowcase
Freq: 1    Word: konverteres
Freq: 1    Word: ingen
Freq: 1    Word: i
Freq: 1    Word: hvilket
Freq: 1    Word: g°r
Freq: 1    Word: gentagelser
Freq: 1    Word: fra
Freq: 1    Word: en
Freq: 1    Word: dette
Freq: 1    Word: desuden
Freq: 1    Word: derfor
Freq: 1    Word: denne
Freq: 1    Word: den
Freq: 1    Word: belastende
Freq: 1    Word: at
Freq: 1    Word: alle

Source er denne tekst:
Dette er en tekst som der skal tælles ordhyppighed på Der er nogle ord som er gentagelser andre er ikke Punktum og andre tegn sorteres ikke fra derfor er der ingen i denne tekst hvilket gør den belastende at læse Desuden konverteres alle ord til lowcase
Avatar billede wolffbrix Nybegynder
24. maj 2003 - 16:55 #6
Jeg selv lavet en løsning hvor jeg indlæse mappen i en multimap. multimappet er oprettet med map<int, string>, så får jeg sorteret efter int værdien, som jeg har ønsket. noget nemmere. fylder 4 linier kode.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester