1

我有一个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 中是否可以部分匹配键值?如果是,我应该如何实施。

4

2 回答 2

2

类中没有机会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-10T07:19:28.127 回答
1

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

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

考虑以下示例:哈希包含键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

于 2016-06-10T07:07:11.857 回答