Частичное совпадение ключей 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 ответа

Решение

Там нет возможности в 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, который на самом деле он не найдет.

Вы можете реализовать метод, который возьмет расширенный ключ и попытается найти любой ключ данного значения в хэше. Здесь вы должны определить некоторые правила, которые, я думаю, могут не возвращать целевое значение.

Подумайте о следующем примере: хеш содержит ключи 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.

Другие вопросы по тегам