部分密钥匹配QHash

时间:2016-06-10 06:33:59

标签: 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中的键值是否可以部分匹配?如果是的话,我该如何实施呢。

2 个答案:

答案 0 :(得分:2)

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

  

qHash()函数根据键计算数值。它可以   使用任何可以想象的算法,只要它总是返回相同的   如果给出相同的参数,则为value。换句话说,如果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);

答案 1 :(得分:1)

首先,在您的示例中,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