2

何百万もの文字列の略語を調べて、完全版に置き換える必要があります。データのため、コンマで終わる略語のみを置き換える必要があります。文字列には複数の略語を含めることができます。

Abbreviation->Fullversion のペアを含むルックアップ テーブルがあり、約 600 のペアが含まれています。

私の現在のセットアップは、このようなものに見えます。起動時に、Jackson を使用して csv ファイルから ShortForm インスタンスのリストを作成し、それらをシングルトンに保持します。

public static class ShortForm{
    public String fullword;
    public String abbreviation;
}

List<ShortForm> shortForms = new ArrayList<ShortForm>();
//csv code ommited

そして、リストを使用するいくつかのコード

for (ShortForm f: shortForms){
    if (address.contains(f.abbreviation+","))
        address = address.replace(f.abbreviation+",", f.fullword+",");
}

これで動作しますが、遅いです。高速化する方法はありますか?最初のステップは、コンマを挿入して ShortForm オブジェクトを読み込むことですが、他に何ができるでしょうか?

======更新 コードを変更して、逆に動作するようにしました。文字列を単語に分割し、セットをチェックして、文字列が略語かどうかを確認します。

    StringBuilder fullFormed = new StringBuilder();
    for (String s: Splitter.on(" ").split(add)){
        if (shortFormMap.containsKey(s))
            fullFormed.append(shortFormMap.get(s));
        else
            fullFormed.append(s);
        fullFormed.append(" ");
    }

    return fullFormed.toString().trim();

テストでは、これが元のアプローチよりも 13 倍以上高速であることが示されています。乾杯デイブコム!

4

3 に答える 3

1

私は HashMap でこれを行うと思います。キーは略語になり、値は完全な用語になります。次に、文字列でコンマを検索し、コンマの前のテキストが辞書にあるかどうかを確認します。おそらく、すべての置換を 1 つのパスで 1 つの文字列にマップし、その後すべての置換を行うことができます。

これにより、合計 O(n) ルックアップに対して各ルックアップが O(1) になり、n は見つかった略語の数であり、より効率的な方法はおそらくないと思います。

于 2013-10-11T08:37:38.583 に答える