Important: Please read the Qt Code of Conduct -

QMultimap - Find all the keys in common with another key

  • Hi to all,

    I'm using QMultimap to store some values in my application in this way:

    struct scheda
           QString gruppo_muscolare;
           QString esercizio;
           QString serie;
           QString ripetizioni;
       QMultiMap<QString, scheda> tabella;

    Then, I populate it by using a for loop after a SQL query:

         for (int i = 0; i < model.rowCount(); ++i) {
          tabella.insert(model.record(i).value("scheda.tipo").toString(), {model.record(i).value("gruppo_muscolare.nome").toString(), model.record(i).value("esercizio.nome").toString(), model.record(i).value("esercizio_scheda.serie").toString(), model.record(i).value("esercizio_scheda.ripetizioni").toString()});

    and I print all the keys associate to a specific key in this way:

             QMultiMap<QString, scheda>::iterator i = tabella.find("A");
                while (i != tabella.end() && i.key() == "A") {
                     qDebug() << "scheda tipo: " << i.key() << "gruppo muscolare: " << i->gruppo_muscolare << " - esercizio: " << i->esercizio  << " - serie: " << i->serie << " - rep: " << i->ripetizioni;

    and I get this result:

    scheda tipo: "A" gruppo_muscolare: "pettorali" nome: "incline press hammer" serie: "1" ripetizioni: "2"
    scheda tipo: "A" gruppo_muscolare: "pettorali" nome: "Chest Press " serie: "3" ripetizioni: "2"
    scheda tipo: "A" gruppo_muscolare: "quadricipiti" nome: "Leg Curl" serie: "2" ripetizioni: "3"

    I would like to group the results when gruppo_muscolare has the same value in order to trigger different actions.

    for example:

    if gruppo_muscolare == "pettorali"
    then do this
    else if gruppo_muscolare == "quadricipiti"
    then do this

    the problem is that I can't suppose to know what "gruppo_muscolare" will contain each time so I think I need to group all the keys which have in common the same value in "gruppo_muscolare".

    How can I do that?

  • you need a map for each data field that you intend to use as a "key". IIUC you are asking for reverse lookup, where the data field becomes the key and the key becomes the data field. There may be a more elegant algorithmic solution, but given your description one is not immediately evident.

    Reading between the lines though, if you are aggregating this data from a SQL database then why not let the DB do the grunt work and concentrate on proper SQL queries to pull the information, grouped as you desire?

  • @Marcus-Barnet
    As @Kent-Dorfman has said.

    You might choose to move the work to GROUP statements at the SQL database side.

    But if you do stick to your QMultiMap. You are perhaps already aware, but you can address your requirement via: ISTM that you need a new QMultiMap whose keys are the values you encounter in scheda.gruppo_muscolare. Populate that from the records you get back from your query. Now you can enumerate this new map's keys (e.g. in alphabetical order) to retrieve gruppo_muscolare grouped.

Log in to reply