0

レーベンシュタイン編集距離を使用して、2 つの文字列がどの程度似ているかを調べています。2つの文字列はそのままです。最初のものは、もしあったとしても、2 つのうち長い方です。また、他も比較したいのは、切り捨てられていない、変更されていない文字列です。2 番目の文字列は末尾が切り捨てられ、文字が欠落している可能性があります。複数の一意の文字列 1 と文字列 2 が存在する可能性があります。

2 番目の文字列のリストを読み込んで、それぞれが「[string two] - $0.00」という形式の行に含まれているので、文字列 2 にスペース、ダッシュ、スペース、そして価格が続きます。

したがって、2 番目の文字列 (形式) のリストがあり、2 つのオプションがあります。価格と「 - 」を削除するか、そのままにしてください。

  • 外すと。各文字列を 2 つ読み取り、区切り文字「$」でトークン化します。文字列 2 の長さがわからないので、stringtwo.removeAll("-") を実行してダッシュを削除してから、空白の .trim() を実行する必要があります。ストリング 2 にダッシュがある場合、それも不本意に削除されます。したがって、これにより、正確な文字列(levenstein = 0)、切り捨てられたが正確な文字列(文字列は長さの文字列1まで同じ-levenstein)、切り捨てられ、整数量のダッシュが欠落しています(文字列は間のいくつかの場所で同じです)のいずれかを取得しますダッシュ、および切り捨てられた場合は末尾も欠落している)、または切り捨てられていないが整数のダッシュが欠落している。

  • 残したら。引き続き各文字列を 2 つ読み取り、区切り文字「$」でトークン化します。これで、文字列 2 "[string two] - " のこの形式ができました。したがって、すべてのレーベンスタイン距離は 3 ずれます。"dog food is yummy" と比較しようとする文字列 2 は "dog food is yum -" であり、levD = 3 ですが、これは文字列 2 "dog food is yummy -" と同じ levD です。

ご覧のとおり、両方のオプションで問題が発生します。文字列 2 の入力リストを文字列 1 のリストに一致させようとしても、プログラムでこれらの問題を克服できないようです。

誰でもこれを行うためのより良い方法を見ることができますか?これを問題なくするために使用できる他の文字列コンパレータはありますか?

4

1 に答える 1

1

これを試してください: 各文字列で見つかった最後の "-" で文字列を切り捨て、残りの文字列をそのまま維持する必要があります。

StringTwo.substring(0, StringTwo.lastIndexOf("-")).trim();

これらの文字列操作はコストがかかる可能性があるため、大量の文字列を操作している場合は、他の最適化を検討することができます。

また、このソリューションは、値をハードコーディングしてコードのどこをトリミングするかを決定するため、脆弱です。これは別の場所で定義して渡すことができるため、変化する可能性があります。

比較的うまく安全に動作するようになったら、次に、より広範な String 操作を行う Apache の StringUtils を調べてみてください。

org.apache.commons.lang.StringUtils from Apache Commons Lang
于 2013-02-01T17:33:54.827 に答える