我有rerusive功能,工作正常。问题是,当行数很大时,它会产生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.
答案 0 :(得分: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
答案 1 :(得分:1)
for(String line : lines) {
// validate line here
if(!errorSet.isEmpty()) {
break;
}
}
答案 2 :(得分:1)
您的问题的解决方案可以简单地循环或while,具有停止条件的逻辑表达式。通常,当我们必须通过Iterable或array的所有元素时,我们使用for循环。如果我们不知道我们要做多少循环,我们使用while循环。 for循环的优点是,我们免费拥有本地化变量,因此我们不会在循环中使用它们,因此我们减少了出现一些错误的可能性。
你的问题是你必须在两个条件下破解程序:
作为矛盾,我们可以说你的计划应该继续:
这为我们提供了简单的表达
errorSet.isEmpty()
lineNumber < lines.length()
我们可以使用逻辑运算符&&
将它们组合起来,并在for循环中用作停止规则。
for(int lineNumber= 0; errorSet.isEmpty() && lineNumber< lines.length(); lineNumber++) {
//code to operate
}
注意:
通常,逻辑表达式使用运算符&&
,以确保计算逻辑表达式的每个部分。另一种选择是&
,如果是假,则不会运行更长时间并返回false。我们可能想要使用这个运算符来表达这个表达式,但我不错。因为当我们遍历所有没有错误代码的行时会产生IndexOutOfBoundException
,如果我们切换位置,那么我们将不会进行任何优化,因为第一个表达式将被评估相同的次数。