2017-06-09 3 views
-2

Ich versuche, meine Ausgabe basierend auf dem Wert zu sortieren, und ich bin unsicher, wie ich es angehen soll. Dies ist meine aktuelle Ausgabe:Wie sortiere ich Werte in einer Karte in C++

E:2 
H:1 
I:3 
L:2 
N:3 
O:2 
S:2 
T:1 
Y:1 

Dies ist, wie ich meine Ausgabe wollen:

I: 3 
N: 3 
E: 2 
L: 2 
O: 2 
S: 2 
H: 1 
T: 1 
Y: 1 

Mein Code:.

#include<iostream> 
using std::cin; 
using std::cout; 
using std::endl; 
#include<string> 
using std::string; 
#include<map> 
using std::map; 
#include<algorithm> 
using std::sort; 

int main() 
{ 
    string input; 
    int line = 0; 
    map<char, int> letters; 
    while (getline(cin, input)) 
    { 
     line += 1; 
     for (int i = 0; i < input.length(); i++) 
     { 
      if (isalpha(input[i])) 
      { 
       if (letters.count(toupper(input[i])) == 0) 
       { 
        letters[toupper(input[i])] = 1; 
       } 
       else 
       { 
        letters[toupper(input[i])] += 1; 
       } 
      } 
     } 
    } 

    cout << "Processed " << line << " line(s)." << endl; 
    cout << "Letters and their frequency:" << endl; 
    for (auto it = letters.cbegin(); it != letters.cend(); ++it) 
    { 

     cout << it->first << ":" << it->second << "\n"; 

    } 
} 
+0

schreiben Ich frage mich, wer so klug ist, wer deine Stimme abgelehnt hat interessante Frage eines Anfängers. –

+0

Sie sollten in Betracht ziehen, std :: unordered_map –

Antwort

1

Wir Anfänger sollten einander helfen :)

In jedem Fall brauchen Sie einen zweiten Container, weil der std::map ist bereits sortiert nach Schlüssel.

Ein allgemeiner Ansatz besteht darin, die Karte in einen anderen Container zu kopieren und den neuen Container vor der Ausgabe zu sortieren. Für Ihre Aufgabe können Sie std::set als zweiten Container verwenden.

Hier sind Sie.

#include <iostream> 
#include <map> 
#include <set> 
#include <utility> 

int main() 
{ 
    std::map<char, size_t> m = 
    { 
     { 'E', 2 }, { 'H', 1 }, { 'I', 3 }, { 'L', 2 }, 
     { 'N', 3 }, { 'O', 2 }, { 'S', 2 }, { 'T', 1 }, 
     { 'Y', 1 } 
    }; 

    for (const auto &p : m) 
    { 
     std::cout << "{ " << p.first << ", " << p.second << " }\n"; 
    } 
    std::cout << std::endl; 

    auto cmp = [](const auto &p1, const auto &p2) 
    { 
     return p2.second < p1.second || !(p1.second < p2.second) && p1.first < p2.first; 
    }; 

    std::set < std::pair<char, size_t>, decltype(cmp)> s(m.begin(), m.end(), cmp); 

    for (const auto &p : s) 
    { 
     std::cout << "{ " << p.first << ", " << p.second << " }\n"; 
    } 
    std::cout << std::endl; 
} 

Die Programmausgabe ist

{ E, 2 } 
{ H, 1 } 
{ I, 3 } 
{ L, 2 } 
{ N, 3 } 
{ O, 2 } 
{ S, 2 } 
{ T, 1 } 
{ Y, 1 } 

{ I, 3 } 
{ N, 3 } 
{ E, 2 } 
{ L, 2 } 
{ O, 2 } 
{ S, 2 } 
{ H, 1 } 
{ T, 1 } 
{ Y, 1 } 

Aufmerksamkeit in Ihrem Programm, dass auch zahlen kann anstelle dieser if-else-Anweisung

if (letters.count(toupper(input[i])) == 0) 
{ 
    letters[toupper(input[i])] = 1; 
} 
else 
{ 
    letters[toupper(input[i])] += 1; 
} 

Sie nur

++letters[toupper(input[i])]; 
+0

Gut auf Sie Vlad :) – Monza

Verwandte Themen