我有一个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中可以部分匹配键值吗?如果是的话,我应该如何实施这一点。
发布于 2016-06-10 07:19:28
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);发布于 2016-06-10 07:07:11
首先,在您的示例中,QHash.contains(QString key)方法尝试查找OMG_1,而实际上它将找不到。
您可以实现一个方法,该方法将接受扩展的键,并尝试在哈希中定位给定值的任何子键。在这里,你必须定义一些规则,我认为,否则它可能不会返回的任天堂价值。
想想下面的例子:哈希包含键、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。
https://stackoverflow.com/questions/37741393
复制相似问题