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