1

私は、文字列のリストを再帰的に1つの文字列に減らすことを本質的に試みているコードの一部に取り組んでいます。

さまざまな長さ(たとえば、配列の長さが2〜4)の一致する文字列配列で構築された内部データベースがあります。

入力文字列配列の例は次のとおりです。

{"The", "dog", "ran", "away"}

さらに例として、私のデータベースは次のように文字列配列で構成できます。

(length 2) {{"The", "dog"},{"dog", "ran"}, {"ran", "away"}}
(length 3) {{"The", "dog", "ran"}.... and so on

したがって、私が行おうとしているのは、入力文字列配列を再帰的に1つのトークンに減らすことです。したがって、理想的には、次のように解析します。

1) {"The", "dog", "ran", "away"}

Say that (seq1) = {"The", "dog"} and (seq2) = {"ran", "away"}

2) {  (seq1), "ran", "away"}
3) {  (seq1), (seq2)}

In my sequence database I know that, for instance, seq3 = {(seq1), (seq2)}

4) {  (seq3)  }

ですから、トークンが1つになると、私は満足し、関数は終了します。

これが私の現在のプログラムロジックの概要です:

public void Tokenize(Arraylist<T> string_array, int current_size)
{
  // retrieve all known sequences of length [current_size] (from global list array)
  loc_sequences_by_length = sequences_by_length[current_size-min_size]; // sequences of length 2 are stored in position 0 and so on

  // escape cases
  if (string_array.Count == 1)
  {
    // finished successfully
    return;
  }
  else if (string_array.Count < current_size)
  {
    // checking sequences of greater length than input string, bail
    return;
  }
  else
  {
    // split input string into chunks of size [current_size] and compare to local database 
    // of known sequences
    // (splitting code works fine)

    foreach (comparison)
    {
      if (match_found)
      {
        // update input string and recall function to find other matches
        string_array[found_array_position] = new_sequence;
        string_array.Removerange[found_array_position+1, new_sequence.Length-1];
        Tokenize(string_array, current_size)
      }
    }   
  }

  // ran through unsuccessfully, increment length and try again for new sequence group
  current_size++;
  if (current_size > MAX_SIZE)
    return;
  else
    Tokenize(string_array, current_size);
}

簡単だと思いましたが、奇妙な結果が出ています。一般的には機能しているように見えますが、出力データをさらに確認すると、いくつかの問題が発生しています。主に、それは特定のポイントまで機能しているように見えます...そしてその時点で私の'curr_size'カウンターは最小値にリセットされます。

したがって、サイズ2、3、4の順に呼び出され、2にリセットされます。私の想定では、所定の最大サイズに達し、完全にベイルします。

コードをできるだけ単純化しようとしたので、文字起こしにはおそらくいくつかの単純な構文エラーがあります。ワシの目のSOユーザーに役立つ可能性のある詳細が他にある場合は、お知らせください。編集します。

前もって感謝します

4

2 に答える 2

1

1つのバグは次のとおりです。 string_array[found_array_position] = new_sequence;

これがどこで定義されているのかわかりません。定義されているかどうかを知る限り、変更されることはありません。

ifステートメントで、match_foundtrueに設定された場合はいつですか?

また、ここには余分な中括弧があるように見えますが、コードの最後のブロックを関数の外に配置したい場合があります。

     }
    }   
  }

コードをクリーンアップして読みやすくする場合に役立ちます。構文エラーを乗り越えると、何が起こっているのかがわかりやすくなると思います。

于 2009-12-09T01:44:30.537 に答える
0

すべての問題が何であるかはわかりませんが、最初に行うことは、メソッドの最初に「キャッチオール」出口ブロックを配置することです。

public void Tokenize(Arraylist<T> string_array, int current_size)
{
  if (current_size > MAX_SIZE)
    return;

  // Guts go here

  Tokenize(string_array, ++current_size);
}

いくつかのこと:

  1. トークンは、入力文字列値から明確に分離されていません。これにより、処理が難しくなり、何が起こっているのかを確認できなくなります。
  2. 擬似コードを書いているようです。
    • loc_sequences_by_lengthは使用されません
    • found_array_positionが定義されていません
    • Arraylistである必要がありますArrayList

全体的に私はジェームズの声明に同意します:

コードをクリーンアップして読みやすくする場合に役立ちます。

-ダグ

于 2009-12-09T16:43:49.373 に答える