0

私は正常に動作する再帰関数を持っています。問題は、行数が膨大な場合、stackoverflow エラーが発生することです。おそらくforループを使用して、反復的に入れたいと思います。それを行うにはいくつかの助けが必要です。

private TreeSet validate(int curLine, TreeSet errorSet) {
    int increment = 0;
    int nextLine = 0;

    if (curLine == lines.length || errorSet.size() != 0) {
        return errorSet;
    } else {
        String line = lines[curLine];

        //validation starts.  After validation, line is incremented as per the requirements

        increment = 1 //As per requirement. Depends on validation results of the line

        if (increment > 0) {
            try{
                Thread.currentThread().sleep(100);  
            }catch(Exception ex){
                System.out.println(ex); 
            }
            nextLine = (curLine + increment);
            validate(nextLine, errorSet);
        }
    }

    return errorSet;
} 

メソッドのポスターの説明:

メソッドはテキスト行を検証します。これらの行には、行が有効な場合にスキップする必要がある行の量の指示があります。そのため、行が有効な場合、インクリメントを使用して多くの行がスキップされます。行が有効でない場合、インクリメントは 0 になります。

4

3 に答える 3

2

そもそもなぜこれが再帰的だったのかわかりません。これは、FOR ループの使用に最適です。次のようなものを使用します。

private TreeSet validate(int curLine, TreeSet errorSet) { 
   int increment = 0;

   if (errorSet.size() != 0)
      return errorSet;

   for (int curLine = 0; curLine < lines.Length; curLine += increment)
   {
      // put your processing logic in here


      // set the proper increment here.
   }
}

増分が常に1になる場合は、curr++代わりに使用できますcurLine += increment

于 2012-07-30T16:21:23.923 に答える
1

問題の解決策は、停止条件の論理式を使用した単純なforループまたはwhileである可能性があります。通常、Iterableまたはarrayのすべての要素を通過する必要がある場合は、forループを使用します。ループの数がわからない場合は、whileループを使用します。forループの利点は、無料でローカライズされた変数があるため、ループの外でそれらを使用できないことです。したがって、バグが発生する可能性が低くなります。

問題は、次の2つの条件でプログラムを中断する必要があることです。

  1. errorSetが空でない場合。
  2. 行の配列にアイテムがなくなったとき。

矛盾として、私たちはあなたのプログラムが継続されるべきであると言うことができます:

  1. errorSetが空になるまで、
  2. そして、行番号がそれらが格納されている配列サイズよりも小さくなるまで。

これは私たちに簡単な表現を提供します

  1. errorSet.isEmpty()
  2. lineNumber < lines.length()

論理演算子&&を使用してそれらを組み合わせ、forループの停止ルールとして使用できます。

for(int lineNumber= 0; errorSet.isEmpty() && lineNumber< lines.length(); lineNumber++)  {

   //code to operate

}

ノート:

通常、論理式には演算子が使用され&&、論理式のすべての部分が確実に評価されます。これの代替手段は&、falseの場合、より長く動作せず、falseを返すことです。この式にこの演算子を使用したくなるかもしれませんが、私は悪い考えです。エラーコードなしですべての行をトラバースすると生成されるためIndexOutOfBoundException、場所を切り替えると、最初の式が同じ回数評価されるため、最適化は行われません。

于 2012-07-30T17:01:36.553 に答える
1
for(String line : lines) {
  // validate line here

  if(!errorSet.isEmpty()) {
    break;
  }
}
于 2012-07-30T16:22:24.317 に答える