部分密钥匹配QHash

  • 本文关键字:QHash 密钥 qt qhash
  • 更新时间 :
  • 英文 :


我有一个定义如下的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值。

考虑以下示例:哈希包含键OMGOM。为了匹配所提供的扩展密钥,您可以实现类似于此的东西

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

相关内容

  • 没有找到相关文章

最新更新