連絡先を検索するための配列に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()などを使用しています。