私は、文字列のリストを再帰的に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ユーザーに役立つ可能性のある詳細が他にある場合は、お知らせください。編集します。
前もって感謝します