Le tri des caractères dans une chaîne, d'abord par la fréquence et par ordre alphabétique

Donné une chaîne, je suis en train de compter les occurrences de chaque lettre de la chaîne, puis le tri de leurs fréquences, de la plus haute à la plus basse. Ensuite, pour les lettres qui ont le même nombre d'occurrences, je dois les trier par ordre alphabétique.

Voici ce que j'ai pu faire jusqu'à présent:

  • J'ai créé un int tableau de taille 26 correspondant aux 26 lettres de l'alphabet, avec des valeurs individuelles représentant le nombre de fois qu'il apparaît dans la phrase
  • J'ai poussé le contenu de ce tableau dans un vecteur de paires, v, de int et char (int pour la fréquence, et char pour la lettre)
  • J'ai trié ce vecteur de paires à l'aide de std::sort(v.begin(), v.end());

Dans l'affichage de la fréquence de comptage, j'ai simplement utilisé une boucle for en commençant par la dernière index pour afficher le résultat de la plus haute à la plus basse. Je vais avoir des problèmes, cependant, en ce qui concerne ces lettres ayant des fréquences similaires, parce que j'ai besoin de les afficher dans l'ordre alphabétique. J'ai essayé en utilisant une étude de boucle à l'intérieur de la boucle de départ avec l'indice le plus bas et à l'aide d'une instruction conditionnelle afin de vérifier si sa fréquence est la même que la boucle externe. Cela semblait fonctionner, mais mon problème est que je n'arrive pas à comprendre comment contrôler ces boucles de sorte que les sorties redondantes seront évités. Pour comprendre ce que je dis, veuillez voir cet exemple de sortie:

Enter a string: hello world

Pushing the array into a vector pair v:
d = 1
e = 1
h = 1
l = 3
o = 2
r = 1
w = 1


Sorted first according to frequency then alphabetically:
l = 3
o = 2
d = 1
e = 1
h = 1
r = 1
w = 1
d = 1
e = 1
h = 1
r = 1
d = 1
e = 1
h = 1
d = 1
e = 1
d = 1
Press any key to continue . . .

Comme vous pouvez le voir, il aurait été bien si ce n'était pas pour les sorties redondantes provoquée par le mauvais pour les boucles.

Si vous pouvez suggérer des plus efficaces ou mieux implémentations quant à mon problème, alors je serais très apprécier aussi longtemps qu'ils ne sont pas trop compliquées ou trop avancé comme je suis juste un C++ débutant.

Si vous avez besoin de voir mon code, le voici: c'est

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    cout<<"Enter a string: ";
    string input;
    getline(cin, input);

    int letters[26]= {0};

    for (int x = 0; x < input.length(); x++) {
        if (isalpha(input[x])) {
            int c = tolower(input[x] - 'a');
            letters[c]++;
        }
    }

    cout<<"\nPushing the array into a vector pair v: \n";
    vector<pair<int, char> > v;

    for (int x = 0; x < 26; x++) {
        if (letters[x] > 0) {
            char c = x + 'a';
            cout << c << " = " << letters[x] << "\n";
            v.push_back(std::make_pair(letters[x], c));
        }
    }

    //Sort the vector of pairs.
    std::sort(v.begin(), v.end());

    //I need help here!
    cout<<"\n\nSorted first according to frequency then alphabetically: \n";
    for (int x = v.size() - 1 ; x >= 0; x--) {
        for (int y = 0; y < x; y++) {
            if (v[x].first == v[y].first) {
                cout << v[y].second<< " = " << v[y].first<<endl;
            }
        }
        cout << v[x].second<< " = " << v[x].first<<endl;
    }

    system("pause");
    return 0;
}
Vous pouvez résoudre ce problème en une seule étape en cours d'exécution de votre tri avec un custom comparateur (voir en.cppreference.com/w/cpp/algorithm/sort pour un exemple).
Vous pouvez également utiliser un map<char, int>
L., mais même si j'ai utilisé une carte, je ne serait pas encore en mesure de trier ses valeurs directement, ai-je le droit? Merci!

OriginalL'auteur makki | 2013-12-22