1

クラスプロジェクトでは、1つのテキストファイルに含まれる10,514曲のタイトル、アーティスト、歌詞を読み上げます。プロジェクトの現在のセクションでは、順序付けられたアンロールリンクリストを作成し、タイトルフィールドで検索を実行しました。コンパレータは、リストをタイトルでソートするようにも作成されています。一致するものを見つけるために必要な比較を追跡する必要があります

テストすると、奇妙な結果が得られます。たとえば、
天使の検索を実行すると、23の一致が返され、552の比較が必要になります。これは、教授によって与えられた回答と一致します

。tはゼロの一致を返し、9530の比較が必要です。ここで、1148の一致は62の一致を返し、8455の比較を必要とします。sは一致
返しません。と8383の比較が必要でしたsaは89の一致を返し、7355の比較が必要でした


私の検索アルゴリズムは次のように実行されます。

  1. リストをループして最初の一致を見つけます
  2. リストをループして、検索フィールドに一致しない最初のインスタンスを見つけます
  3. 開始オブジェクトと終了オブジェクトをデータ構造のSublistメソッドに送信します。このメソッドは、これら2つのオブジェクトをループして、一致の個別のリストを作成します。
  4. 一致のリストを返す

ステップ1と2の両方で、現在の値を次の方法で検索値と比較します。
if (currentSong.getTitle().toLowerCase().startsWith(titleSearch))

1文字の検索でfalseを返すこのコード行についてはどうでしょうか。ただし、aを追加すると、値が見つかりますか?できれば、デバッガーでループの8000回の反復を手動で実行する必要がないソリューションが必要です。さらに、教授は期待値を使用して構造にテストを提供し、私のコードはすべてのテストに合格しました。

4

1 に答える 1

1

私は問題が何であるかを知りました。subListメソッドでは、バイナリ検索メソッドを使用して、最初に見つかった一致のインデックス位置を特定しました。ただし、バイナリ検索では最初に一致したものだけが返されるため、配列を逆方向にたどって実際の最初の一致を見つけるループがありました。

ただし、この場合、バイナリ検索から返された最初のヒットは0インデックスであったため、後方に移動すると、ArrayIndexOutOfBoundsExceptionがスローされ、全体が短絡しました。2番目のテストを追加すると、問題が解決しました。

于 2010-10-28T00:37:08.953 に答える