Частичный ключ, соответствующий QHash
1 smyslov [2016-06-10 09:33:00]
У меня 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_1 содержит OMG, я должен быть в состоянии получить Oh my God! ,
Я попытался сделать это, используя
if(hashLookup.contains(a)
//do something
который, конечно же, пытается найти ключевой OMG, который отсутствует в таблице поиска и ничего не возвращает. Возможно ли частичное сопоставление ключевых значений в Qt? Если да, как мне следует это реализовать.
qt qhash
2 ответа
2 Решение Kirill Chernikov [2016-06-10 10:19:00]
В классе 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);
1 maxik [2016-06-10 10:07:00]
Во-первых, в вашем примере метод QHash.contains(QString key) пытается найти OMG_1, который на самом деле он не найдет.
Вы можете реализовать метод, который будет использовать расширенный ключ и пытается найти какой-либо подраздел данного значения в хеше. Здесь вы должны определить некоторые правила, которые я думаю, или они могут не возвращать значение intendend.
Вспомните следующий пример: хэш содержит ключи 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.