Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Sorting data based on key



  • Hi,

    I have data in a format like as,

    QList<QPair<QString, QJsonValue>> sessionList
    

    Check the sample data of sessionList

    QPair("2717b2bb-aa1f-460e-b6ff-c932114a8b99",QJsonValue(object, QJsonObject({"CreatedAt":"2019-06-18T10:34:37.3501135","FileName":"imgLeft8bitColor_000000050.png","FrameIndex":30,"ImageGuid":"76d453ed-0950-424d-952f-b20d1f0c921f","IsKeyframe":false, "TabGuid":"2717b2bb-aa1f-460e-b6ff-c932114a8b99"})))
    QPair("078f7119-844d-4c31-9eee-c695f2c9adbb",QJsonValue(object, QJsonObject({"CreatedAt":"2019-06-18T11:21:58.5620774","FileName":"imgLeft8bitColor_000000050.png","FrameIndex":30,"ImageGuid":"3c9517ae-6c96-4746-8279-1c143339f576","IsKeyframe":false, "TabGuid":"078f7119-844d-4c31-9eee-c695f2c9adbb"})))
    

    Like above I have more data that I want to sort based on QPair.first(consider as key)(say, "078f7119-844d-4c31-9eee-c695f2c9adbb").
    So what algorithm I should use which sort my QJsonValue for the same type of key in one container?

    Note: Key count can vary



  • I found one solution for that, use QMultiHash or QMultiMap, here it can allow adding multiple data under the same key, so in that way, I can distinguish or sort data.

    But still, I'm looking for an option where I can have one key and data can be added under that key only, not the way QMultiHash work, as it stores key and data in a separate list even if keys are same.


  • Moderators

    @npatil15 said in Sorting data based on key:

    So what algorithm I should use which sort my QJsonValue for the same type of key in one container?

    Which do you do more often: Look up your data by key, or look up your data by index? If you look-up by key, use a map instead of a list as your data container. A map also automatically sorts all your data by key.

    // Writing data
    QMap<QString, QJsonValue> sessionMap;
    sessionMap["2717b2bb-aa1f-460e-b6ff-c932114a8b99"] = QJsonObject(...);
    sessionMap["078f7119-844d-4c31-9eee-c695f2c9adbb"] = QJsonObject(...);
    
    ...
    
    // Reading data
    QJsonValue val = sessionMap["2717b2bb-aa1f-460e-b6ff-c932114a8b99"];
    qDebug() << val;
    // Prints QJsonValue(object, QJsonObject({"CreatedAt":"2019-06-18T11:21:58.5620774","FileName":"imgLeft8bitColor_000000050.png","FrameIndex":30,"ImageGuid":"3c9517ae-6c96-4746-8279-1c143339f576","IsKeyframe":false, "TabGuid":"078f7119-844d-4c31-9eee-c695f2c9adbb"})))
    
    

    If you don't want to switch to a map, you could use std::sort() and give it a comparison function:

    std::sort(
            sessionList.begin(),
            sessionList.end(),
            [](const QPair<QString, QJsonValue> &a, const QPair<QString, QJsonValue> &b)->bool
    {
       return a.first < b.first;
    });
    

    Finally, even if you don't want to change to a map, you should use a QVector, not a QList: https://marcmutz.wordpress.com/effective-qt/containers/



  • Thanks for the reply,

    But tell me what if I have the same key for multiple data, then QMap will update the data and erase the previous one, isn't it? That I don't want.





  • Found solution, using below I can achieve to store multiple QJsonValues under a single key, and it works well.

    QMap<QString, QList<QJsonValue>> map;
    const QJsonValue v;
    
    map["Unique ID in String"] << jsonvalues;
    

    Hope it help others :)



  • You don't need it.
    QMap<QString, QJsonValue> map; and then map.insertMulti(QStringLiteral("Unique ID in String"),QJsonValue(/*...*/));


Log in to reply