1

特定の文字列が含まれている場合に 2 次元文字列配列をフィルター処理する検索を作成しています。ユーザーは、ダイヤル パッド (0 ~ 9) に対応する番号をダイヤルしながら検索できます。たとえば、56 という数字を入力すると、検索では、'56'、'JJ'、'JM'、JO'、'KM'、'KN'、'KO'、'LM'、 2 次元配列の 'LN'、'LO'。

私のアプローチは、可能性を配列に格納してから、2 次元配列をループして、それらのいずれかにシーケンスが含まれているかどうかを確認することです。ネストされたループ。数時間かけて書く前に、これを行うためのより良い方法や同様のものへのリンクがあるかどうか疑問に思っています。

4

2 に答える 2

1

1 つのアプローチは (配列でなければならない場合)、入力された文字に基づいて可能な名前のサブセットを構築し、各文字が入力された後に、完全なセットではなくサブセットを比較することです。

たとえば、あなたが

Bill, Bob, Conroy, Fran, Riley, Shelley

2 (A、B、C) を入力すると、

Bill, Bob, Conroy, (Fran if contains)

次に、6 (M,N,O) を入力すると、

Bob, Conroy, (Fran if contains)

これ を行うには、現在一致しているインデックスのコレクションが必要です。おそらくリストが最適な実装です。

List<Integer> indicesMatched;

含まれている場合 、一致した文字列のインデックスと、最初に一致した文字が文字列内にある場所のインデックスを、おそらくマップとして保存する必要があります (または List と Point クラスの誤用)。

Map<Integer, Integer> matched;  // where the key is the array index and the value is the string index

次に、一致したインデックスの最初のセットをこれに入力できます。次に、2番目の数字/文字を比較するときに、リストに保存されているインデックスのみを使用し、それぞれについて2番目の文字と一致しないインデックスを削除します

擬似コード: (で始まる)

// First key press
// For each entry in your array
    // If a match
       // Add to matched index List

// Second Key Press -- Repeat this step for each subsequent key press
// For each index in list
    // Get the entry at that index
       // If not a match in second letter
           // Remove the index from list

擬似コード: (コンティアン用)

// First key press
// For each entry in your array
    // If a match
       // Add to matched index map

// Second Key Press -- Repeat this step for each subsequent key press
// For each index in map
    // Get the entry at that index
       // If not a match in second letter (based on the stored string index)
           // Remove the index from map
于 2013-07-04T20:38:33.093 に答える
0

検索されたすべての文字列(この場合は名前だと思います)を含む配列がある場合、次のように記述します。

  1. ユーザーが数字を入力します。たとえば 5 としましょう
  2. 最初の文字が J、K、または L であることがわかりました。
  3. 最初のJが見つかるまで配列を検索し、それを「開始」と呼ぶインデックスマーカーを設定します
  4. L で始まる最後の要素に到達するまで検索を続け、「end」というインデックス マーカーを追加します。
  5. 次の番号について繰り返しますが、今回は配列全体を検索する代わりに、単に「開始」マーカーから「終了」マーカーまで検索し、必要に応じて両方を再調整します。

ケースを考えてみましょう:

Adam James Kevin Laurie Lisa Steve

ユーザーが 5 を入力したので、ループして次のように判断します。

start = 1; //index of "James"
end = 4; //index of "Lisa"

したがって、配列は次のようになります

James Kevin Laurie Lisa

ここで、ユーザーが別の番号を入力し、この (完全なアドレス帳を考えると、はるかに小さい) 配列でもう一度入力しますが、今回は各名前の 2 番目の文字を比較し、可能性に適合しないインデックスを除外します。したがって、ユーザーがここで 2 を入力すると、可能な文字は A、B、および C であることを意味します。

James Laurie

等々。

于 2013-07-04T19:28:33.050 に答える