0

連絡先を検索するための配列にvoiceResultsがあります。

Ben McDonald
Ben MacDonald
Ken McDonald
Ken MacDonald

別の配列でpotentialMatches(例)を確立しました:

Ben McDonald
Benjamin MacDonald
Donna McBlead //anagram
Ben Mad
abcdelmno //occurrences in alphabetical order
onmledcba //occurrences in reverse alphabetical order
completely Random
a cannon
BK Lounge

私の目標は、ユーザーが表示したい連絡先である可能性が最も高いものを特定することです。

2つの配列をループするときは、ゲームのマスターマインドと同様のロジックを使用します。このロジックでは、文字が「正しいが間違った場所にある」または「正しい場所にある」かどうかを確認できます。次に、それを要素の.length()と比較して、文字の一致と正確な位置の一致の浮動パーセンテージを取得できます。

上記を行うには、配列の要素間をループするだけでなく、要素を文字ごとに分割して、個々の要素の文字を比較する必要があります。首謀者/アナグラムロジックを確立するには、一致しない文字が残るまで一致する文字を削除し、その量を元の長さと比較してパーセンテージを取得する必要があります。

上記の配列データの例を見ると、これを逆に実行して、名と名を吐き出す必要があります。

アレイごとに、次のことから始めました。

    ArrayList<String> voiceResults = new ArrayList<String>();
    ListIterator<String> itr = voiceResults .listIterator();
    Arrays.asList(voiceResults.toArray());

    while (itr.hasNext()) {
    sid = itr.nextIndex();
    element = itr.next();

    sidpass = sid.toString();
    rawpass = element.toString().toLowerCase();
    rawpass.trim();

    hcs = rawpass.split("\\s");
    hnc = hcs.length;

    if (hnc == 2) {
    fn = hcs[0]; //first name
    ln = hcs[1]; //last name
    fn = fn.replaceAll("[^a-z]", ""); //remove punctuation
    ln = ln.replaceAll("[^a-z]", "");

    }

上記を投稿しましたが、正しい開始方法ではないと確信しています。

アナグラムチェックとアルゴリズムの多くの例を読むと、それらは大きく異なり、forおよびwhileループ、ハッシュマップ、ハッシュテーブル、ヒストグラム、浮動小数点値などを使用します。

私は手を上げて、これらのループ、内部ループ、内部要素ループを最初に実行するための最良/最速/最も実用的な方法を完全に失っています...

ループを最初にどのように構成する必要があるかについて、いくつかの提案をいただければ幸いです。

文字の比較と逆反復のさらなる提案/例/リンクは素晴らしいでしょう。うまくいけば、私はすべてをつなぎ合わせることができます。

最後に、要素に関連するこれらのパーセンテージをどのように保存する必要がありますか?

よろしくお願いします。

注意:サンプルデータは別のことを示唆しているかもしれませんが、私はすでにループと.contains().matches()などを使用しています。

4

2 に答える 2

1

このライブラリを使用することもできます。 http://code.google.com/p/string-similarity/

実装はクリーンで、必要に応じて簡単にカスタマイズできます。

たとえば、文字列の比較にJaroStrategyを使用しましょう

    double similarity = 0.0;
    // Calculates the similarity score of objects, whereas 
    // 0.0 implies absolutely no similarity 
    // 1.0 implies absolute similarity.   
    SimilarityStrategy strategy = new JaroStrategy();
    StringSimilarityService service = new StringSimilarityServiceImpl(strategy);

similarity = service.score("Ben McDonald", "Ken MacDonald");   
于 2012-06-08T12:59:35.173 に答える
1

さまざまなスペルアルゴリズムがありますが、過去に私はLevenshteinまたはSoundexを使用しました(それぞれに長所と短所があります)。ボーカルからこれを取得するので、Soundexはあなたにとってよりうまくいくかもしれません。

また、チェックアウトすることもできます。

最も近い文字列の一致を取得する

スペルチェッカーで提案を与えるアルゴリズムは何ですか?

于 2012-06-08T12:38:59.280 に答える