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(String line : lines) {
  // validate line here

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

您的问题的解决方案可能是简单的 for 循环或 while,并带有停止条件的逻辑表达式。通常,当我们必须遍历 Iterable 或数组的所有元素时,我们使用 for 循环。如果我们不知道要执行多少个循环,我们会使用 while 循环。for 循环优于 while 的优点是,我们免费拥有局部变量,因此我们不能在循环之外使用它们,因此我们减少了出现一些错误的可能性。

你的问题是你必须在两个条件下打破程序:

  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

}

笔记:

逻辑表达式通常使用 operator &&,以确保对逻辑表达式的每个部分进行评估。另一种方法是&,如果为 false,则不要操作更长时间并返回 false。我们可能很想对这个表达式使用这个运算符,但我会是个坏主意。因为当我们遍历所有行时不会生成错误代码IndexOutOfBoundException,如果我们切换位置,那么我们将不会进行任何优化,因为第一个表达式将被评估相同的次数。

于 2012-07-30T17:01:36.553 回答