我正在尝试使用QMutableHashIterator迭代QHash并找到所有重复值,然后将每个重复值的键添加到QStringList。我之前从未使用过QHash,也不确定如何解决这个问题。在这个阶段我的代码没有得到任何输出......我知道我做错了什么?
QStringList FileChecker::getDuplicateList() {
QStringList tempList;
QString tempStr;
QString currentKey;
QByteArray currentValue;
QMutableHashIterator<QString, QByteArray> i(m_hash);
do {
while (i.hasNext()) {
i.next();
currentKey = i.key();
currentValue = i.value();
while (i.findNext(currentValue)){
tempStr.append(currentKey);
tempStr.append(i.key());
i.remove();
}
tempList.append(tempStr);
tempStr.clear();
}
} while (m_hash.size() > 0);
return tempList;
}
答案 0 :(得分:1)
是否意图从列表中删除所有项目(因为你循环直到m_hash为空......)?此代码不应以非空哈希值返回 Qt使用Java样式迭代器(http://doc.qt.io/qt-5/qmutablehashiterator.html)。在你的第一个i.next()之后,你的迭代器位于第一个(第0个)和第二个元素之间,所以如果你的第一个键没有任何重复,i.findNext(...)将离开我的结尾hash,所以i.hasNext()应该不断返回false。
你会想要这样的东西:
QStringList FileChecker::getDuplicateList() {
QStringList tempList;
QString tempStr;
QString currentKey;
QByteArray currentValue;
QMutableHashIterator<QString, QByteArray> i(m_hash);
while (m_hash.size() > 0)
{
i.toFront();
i.next();
currentKey = i.key();
currentValue = i.value();
i.remove();
while (i.findNext(currentValue)){
tempStr += i.key() + " ";
i.remove();
}
tempList.append(tempStr);
tempStr.clear();
}
return tempList;
}
答案 1 :(得分:0)
由于您正在寻找具有相同&#34;值&#34;的项目,因此反转键和值的角色将免费提供给您(伪代码):
QHash<QByteArray, QStringList> m_hash;
// fill m_hash
for(auto fileName : fileNames) {
m_hash[md5sumForFile(fileName)] << fileName;
}
// now for each Key of m_hash, the Value is a list of filenames for
// which md5sum(file contents) equals Key
QStringList results;
for(auto dupes : m_hash) {
results.append(dupes.join(", "));
}