1

私は次のように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でキー値の部分一致は可能ですか? はいの場合、これを実装するにはどうすればよいですか。

4

2 に答える 2

2

ハッシュ関数 (Qt ドキュメント: qHash ) を使用するQHashため、キーの部分一致によって値を抽出する機会はクラスにありません。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);
于 2016-06-10T07:19:28.127 に答える
1

まず、あなたの例では、メソッドはOMG_1QHash.contains(QString key)を見つけようとしますが、実際には見つかりません。

拡張されたキーを取り、ハッシュ内の指定された値のサブキーを見つけようとするメソッドを実装できます。ここでは、私が考えるいくつかのルールを定義する必要があります。そうしないと、意図した値が返されない場合があります。

次の例を考えてみてください: ハッシュにはキーOMGOMが含まれています。提供された拡張キーと一致させるには、次のようなものを実装します

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を見つけることはできません。提供された拡張キーの最初の文字を取得し、それが含まれているかどうかをテストするメソッドを実装することもできます。見つからない場合は、2 番目に時間がかかり、再度テストが行​​われます。これは、 OMGを支持してOMと一致します。


また、後で一致したキーを使用する可能性があるため、trueを返すだけでなく、それを返す必要があることに注意してください。

于 2016-06-10T07:07:11.857 に答える