QMultimap遍历

遍历QMultimap

提示:QMultimap和Qmap的遍历存在不同的地方,也是一个大坑:


我们先看正常情况的显示

提示:看下面的代码,正常情况下的Qmap和QMulitmap是完全没问题的:

  QMap<QString,QString> map;
    map.insert("1","123");
    map.insert("2","321");
    map.insert("3","321");
    map.insert("4","321");
    for ( auto key:  map.keys()){
        qDebug()<<"正常情况下的容器遍历结果:"<<map.value(key);  // value值正常显示
    }
    
  QMultiMap<QString,QString> mlist;
    mlist.insert("1","123");
    mlist.insert("1","321");
    mlist.insert("1","321");
    mlist.insert("2","321");
    mlist.insert("2","456");
    qDebug()<<mlist.keys();     // QList("1", "1", "1", "2", "2")  同样没有问题

接下来进入主题

提示:当两个QMulitmap想要对比内容时,我们需要通过遍历来实现,但是QMultimap的遍历存在一个大坑。

 QList<QString> listKeys = mlist.keys();
    for ( auto key:  listKeys){
        qDebug()<<mlist.value(key);     // 结果是 321,321,321,456,456 可能有人会问为什么?
        // 难道不应该是123,321,321,321,456吗?
    }

原因分析:

提示:原因很简单,因为相同的key,value做了追加.
也就是说key=1时,mlist.keys(1) 所产生的结果QList()包含的不是当前value,而是所有key=1的value即QList(321,321,321,123)
同理key = 2时,值为QList(456,321)
所以QMultimap存在相同key时的遍历想得到当前对应的value值就不能通过这种方式进行遍历了。

再看下一个:

 QMultiMap<QString,QString> mlist;
    mlist.insert("1","123");
    mlist.insert("1","321");
    mlist.insert("1","321");
    mlist.insert("2","321");
 for (auto value: mlist.values()){
        qDebug()<<  "key="<<mlist.key(value) << "value = "<<value;  //看到这你会发现结果是一样的。
        // 你会问为什么?因为还有一个mlist.keys("321")的结果是2呢,为什么不显示?
        // 答案:和上面说的一样,mlist.keys("321")的结果是QList(1,2),至于为什么显示的是1,那是因为默认显示首个值。也就是mlist.keys("321").at(0)的值
    }
 qDebug()<<  "key="<<mlist.keys("321");  //key= QList("1","1","2")

输出结果
key= “1” value = “321”
key= “1” value = “321”
key= “1” value = “123”
key= “1” value = “321”
key= QList(“1”, “1”, “2”)


解决方案:

提示:我们应该怎样才能按照正常的顺序进行遍历显示呢?
我们先看下正常的输出显示结果:

for ( int i = 0; i < mlist.keys().count();i++){
        qDebug()<<mlist.keys().at(i)<<"values:\t"<<mlist.values( mlist.keys().at(i));        
    }

输出结果如下:
“1” values: QList(“321”, “321”, “123”)
“1” values: QList(“321”, “321”, “123”)
“1” values: QList(“321”, “321”, “123”)
“2” values: QList(“456”, “321”)
“2” values: QList(“456”, “321”)

我们想要的结果

QList<QString> list=mlist.keys();  //去重,去除容器中,相同的key
list.erase( std::unique(list.begin(),list.end()),list.end());
for ( int i = 0; i < list.count(); ++i){               //所以正常情况下可以通过这种方式进行 具有相同key的QMulitmap的遍历
        qDebug()<<list.at(i)<<"values:\t"<<mlist.values(list.at(i));
        QString strkey = list.at(i);
        QList<QString> strKeyValueList = mlist.values( strkey);
        for ( int j = 0; j < strKeyValueList.count(); ++j){
            QString strKeyValue = strKeyValueList.at(j);
            qDebug()<<"(key,value)="<<strkey<<","<<strKeyValue;  // //值已经取出,具体逻辑根据实际情况而定
        }
    }

输出结果:
“1” values: QList(“321”, “321”, “123”)
(key,value)= “1” , “321”
(key,value)= “1” , “321”
(key,value)= “1” , “123”
“2” values: QList(“456”, “321”)
(key,value)= “2” , “456”
(key,value)= “2” , “321”

至于具体的逻辑可以根据自己的需求进行细化,感谢支持,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值