我在迭代的向量中有一组有序的键/值映射。我知道一个唯一的密钥,基于此,我需要在它之前和之后获得键/值对,直到达到极限。例如:
QVector < QMap < QString, QString > > map;
QMap < QString, QString > temp;
temp.insert("key1", "parent");
map.append(temp);
temp.clear();
temp.insert("key2", "value1");
map.append(temp);
temp.clear();
temp.insert("key3", "value2");
map.append(temp);
temp.clear();
temp.insert("key4", "value3");
map.append(temp);
temp.clear();
temp.insert("key5", "parent");
map.append(temp);
假设我有一个值“key3”,我希望在“key3”之前获得键/值对,直到达到“parent”,之后直到达到“parent”(不包括“parent”) , 我该怎么做呢?我想不出一个简单的方法。
QMap < QString, QString > newMap;
QMap < QString, QString >::iterator i;
for (int i = 0; i < map.size(); ++i) {
QMap < QString, QString > vectorMap = map.at(i);
for (j = vectorMap.begin(); j != vectorMap.end(); ++j) {
if (j.key() == "key3") {
//set a bool to true and
//get j.key() and j.value() before and after until "parent" is reached
newMap.insert(j.key(), j.value());
}
}
}
newMap将具有键/值对(“key2 / value1”,“key3 / value2”,“key4 / value3”);
编辑我正在尝试的内容:
QString selection = "key3";
//for going backwards, still need to go forward
for (int i = 0; i < map.size(); ++i) {
QMap < QString, QString > vectorMap = map.at(i);
QMapIterator < QString, QString > iter(vectorMap);
while (iter.hasNext()) {
iter.next();
if (iter.key() == selection && iter.value() != "parent") {
do {
previousText = iter.previous();
tempMap.insert(iter.key(), iter.value());
newMap.append(tempMap);
tempMap.clear();
qDebug() << "previousText" << previousText;
iter.previous();
} while (previousText != "parent");
}
}
}
答案 0 :(得分:0)
编辑现在,我认为我理解了这个问题,这是一个解决方案。
请注意,这会利用QMap
的一些特性,即当您遍历QMap
时,它会按键顺序迭代。它不处理QMap
有多个相等键的情况。
目前非常未经测试,非常黑客,但我希望它能让你超越目前的障碍。
我试图让它足够清晰,以便您理解逻辑,但您可以单独使用QMap::iterator
来回移动以确定要复制的范围。
QVector < QMap < QString, QString > > map;
QMap < QString, QString > temp;
// populate your maps...
QMap < QString, QString > newMap;
// traverse your QVector< QMap<QString, QString> > map...
QString selection = "key3";
QVectorIterator<QMap<QString, QString> > vecIter(map);
while (vecIter.hasNext())
{
// pull out your QMap<QString, QString>
QMap<QString, QString> tempMap = vecIter.next();
// see if selection exists in the map
if (tempMap.find(selection) != tempMap.end())
{
// find list of keys that map to "parent"
QList<QString> parentKeys = tempMap.keys("parent");
// get the Key that maps to "parent" that precedes 'selection'
QString preKey;
QListIterator<QString> liter(parentKeys);
while (liter.hasNext())
{
if(liter.peekNext() < selection)
{
preKey = liter.next();
}
else
{
// we've passed the selection key, break the loop
break;
}
}
// now traverse the map and copy
// QMap::upperBound returns an iterator to the next greatest key after the key you give it
QMap<QString, QString>::const_iterator mit = tempMap.upperBound(preKey);
for(; mit != tempMap.constEnd(); ++mit)
{
if ((*mit)->value() != "parent"))
{
newMap.insert((*mit)->key(), (*mit)->value());
}
else
{
// break out because we've just encountered the "parent" value after our selection
break;
}
}
}
} // while (vecIter.hasNext())
答案 1 :(得分:0)
这个怎么样:使用你的地图的“查找”功能(或其他)来获得指向你正在寻找的项目的迭代器(“key3”)。从“key3”迭代器构造一个反向迭代器。在两个单独的循环中推进这两个迭代器中的每一个,直到它指向包含“父”的内容。在每个循环中,随时收集元素。