部分键匹配 QHash

Partial key matching 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

我有几个QString如下:

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,它不存在于查找 table 中并且不 return 任何东西。 Qt 中可以部分匹配键值吗?如果是,我应该如何实施。

首先,在您的示例中,QHash.contains(QString key) 方法试图找到 OMG_1,但实际上找不到。

您可以实施一种方法,该方法将采用 扩展键 并尝试在散列中找到给定值的任何子键。在这里你必须定义一些我认为的规则,否则它可能不是 return 预期值。

考虑以下示例:散列包含键 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.


另外请记住,您稍后可能会使用匹配的密钥,因此您应该 return 它而不是仅 returning true

QHash class 中没有机会通过键的部分匹配来提取值,因为 QHash 使用散列函数(Qt 文档:qHash),其中:

The qHash() function computes a numeric value based on a key. It can use any algorithm imaginable, as long as it always returns the same value if given the same argument. In other words, if e1 == e2, then qHash(e1) == qHash(e2) must hold as well. However, to obtain good performance, the qHash() function should attempt to return different hash values for different keys to the largest extent possible.

不同的键几乎总是给出不同的哈希值。

在您的任务中,您可以在 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);