遍历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”
至于具体的逻辑可以根据自己的需求进行细化,感谢支持,加油!