我有一个定义如下的QHash
QHash<QString, QString> hashLookup;
我在这个散列中插入了一些值,如下所示:
hashLookup.insert("OMG", "Oh my God!");
hashLookup.insert("LOL", "Laugh out loud");
hashLookup.insert("RIP", "Rest in peace");
// and so on
我有几个QStrings如下:
QString a = "OMG_1";
QString b = "LOL_A";
QStirng c = "OMG_YOU";
QString d = "RIP_two";
我应该找到这些值是否存在于hashLookup
中,即,由于OMG_1
包含OMG
,我应该能够检索Oh my God!
。
我已经尝试过使用
if(hashLookup.contains(a)
//do something
其当然试图查找查找表中不存在并且不返回任何内容的密钥OMG。Qt中键值的部分匹配可能吗?如果是,我应该如何着手实施。
QHash
类中没有机会通过密钥的部分匹配来提取值,因为QHash
使用哈希函数(Qt文档:qHash),该函数:
qHash()函数根据键计算一个数值。它可以使用任何可以想象的算法,只要它总是返回相同的结果值,如果给定相同的参数。换句话说,如果e1==e2,那么qHash(e1)==也必须保持qHash(e2)。然而,为了获得良好的性能,qHash()函数应该尝试返回不同的不同密钥的哈希值。
不同的键几乎总是给出不同的哈希。
在您的任务中,您可以在QHash
键上运行,并与QString
功能进行比较。类似这样的东西:
QString getHashValue(const QString& strKey, const QHash<QString, QString>& hashLookup)
{
QList<QString> uniqueKeys = hashLookup.uniqueKeys();
foreach(const QString& key, uniqueKeys)
{
if(strKey.contains(key))
return hashLookup.value(key);
}
}
getHashValue("OMG_1", hashLookup);
首先,在您的示例中,QHash.contains(QString key)
方法试图查找OMG_1,但实际上它找不到。
您可以实现一个方法,该方法将采用扩展键,并尝试在哈希中定位给定值的任何子键。在这里,你必须定义一些规则,否则它可能不会返回intended值。
考虑以下示例:哈希包含键OMG和OM。为了匹配所提供的扩展密钥,您可以实现类似于此的东西
bool hashContainsExpanded(const QString &key) const {
if (!hash.contains(key) && key.length() > 1)
return hasContainsExpanded(key.substring(0, key.length() - 1));
return hash.contains(key);
}
此方法将允许您找到键OMG,但不能找到此键中包含的OM。您还可以实现一种方法,该方法将获取所提供的扩展键的第一个字符,并对其进行包含性测试。如果未找到,则需要第二次,然后再次测试,依此类推。这将匹配OM,而有利于OMG。
还要记住,您稍后可能会使用匹配的密钥,因此您应该返回它,而不是只返回true。