2016-06-10 7 views
1

У меня есть 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? Если да, как мне следует это реализовать.

+0

ли ваш вариант использования только принимаем _ ? Если это так, вы можете просто разбить его на _ и взять первую часть. –

+0

** не используйте QHash ** для такой цели. Это неправильная структура данных. Функция qHash определяется глобально для строк, а 'qHash (« OMG »)! = QHash (« OMG_1 »)'. Вы хотите использовать QMap, std :: map со компаратором, подобным тому, что предложил Кирилл Черников. – UmNyobe

+0

Некоторые из них также представлены в виде , то есть без _подобных OMG1, RIP2A и т. Д. Я уже думал о вашем предположении, но поскольку он не решает сценарий OMG1, RIP2A и т. Я не был уверен, как продолжить @JeffreyvandeGlind – smyslov

ответ

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); 
+1

Так как это немного сложно с QHash, предложите ли вы использовать что-то другое, отличное от QHash, но которое служит той же цели. – smyslov

+0

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

1

Во-первых, в вашем примере метод 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.


Также имейте в виду, что вы можете работать позже согласованного ключа и, таким образом, вы должны вернуть его вместо того, чтобы только возвращение истинного.