Java 使用递归计算标准输入中剩余要读取的字符串数
我想写一个方法,它有一个与输入流关联的Scanner参数,并计算输入中的字符串数。但是,我有一个堆栈溢出异常。你能告诉我原因吗?多谢各位Java 使用递归计算标准输入中剩余要读取的字符串数,java,Java,我想写一个方法,它有一个与输入流关联的Scanner参数,并计算输入中的字符串数。但是,我有一个堆栈溢出异常。你能告诉我原因吗?多谢各位 import java.util.Scanner; public class test { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println(count(input)); } public st
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println(count(input));
}
public static int count(Scanner input) {
if (input.hasNextLine())
return 1 + count(input);
else
return 1;
}
}
您需要在
return1+count(input)
行中的input
上调用nextLine()
。您正在检查下一行,但实际上没有任何内容占用它。这意味着扫描仪永远不会用完要处理的行。您需要在input
行中调用nextLine()
。您正在检查下一行,但实际上没有任何内容占用它。这意味着扫描器永远不会用完要处理的行。因为您的问题表明您要计算给定输入中的字符串数,那么下面的代码将递归地执行此操作。另一个答案的建议计算给定输入中的行数
注意:扫描仪#next()
使用空格(''
)作为默认分隔符
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println(count(input));
}
public static int count(Scanner input) {
if (input.hasNext()) {
input.next(); // move Scanner's position to the next string
return 1 + count(input);
}
return 0;
}
}
输入:
The dog barks loudly.
输出:
4
由于您的问题表明您希望计算给定输入中的字符串数,因此下面的代码将递归地进行计算。另一个答案的建议计算给定输入中的行数 注意:
扫描仪#next()
使用空格(''
)作为默认分隔符
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println(count(input));
}
public static int count(Scanner input) {
if (input.hasNext()) {
input.next(); // move Scanner's position to the next string
return 1 + count(input);
}
return 0;
}
}
输入:
The dog barks loudly.
输出:
4
hasNextLine()
调用不会占用该行,您需要调用nextLine()
才能移动到下一行。计算字符串或行的数量?你关心数字吗(例如,int
,float
,long
,…)?@JonnyHenly只关心字符串,而我只在控制台中输入字符串。是什么分隔或分隔字符串(即新行、空格、逗号、破折号等)?你为什么认为必须使用递归编写此代码。这大概是最糟糕的写入方式,因为即使您更正了当前错误,也总会有一些输入行导致stackoverflowerr
错误。hasNextLine()
调用不会占用该行,您需要调用nextLine()
以移动到下一个。是否计算字符串或行数?你关心数字吗(例如,int
,float
,long
,…)?@JonnyHenly只关心字符串,而我只在控制台中输入字符串。是什么分隔或分隔字符串(即新行、空格、逗号、破折号等)?你为什么认为必须使用递归编写此代码。这大概是最糟糕的写入方式,因为即使您更正了当前错误,也总会有一些输入行会导致堆栈溢出错误。你能给我解释一下这行是什么意思,或者给我演示一下正确的代码吗?Java是我的第一种编程语言,所以我有很多东西要学。@Studiegriffin“Consumes”表示它从输入中读取行。假设您的输入有三行,A
,B
,C
。假设有一个光标指向a
行的开头hasNextLine()
检查光标后是否有一行,但它不会移动光标。因此,每次调用它时,光标仍将位于A
的开头。这样就得到了无限递归。如果调用nextLine()
,它将读取行A
,此时光标将指向B
。这就是“消费”的含义。ajb是这么说的。您也可以在这里查看JavaDoc:@StewieGriffin.hasNextLine()不移动光标,它只是检查下一行是否存在。但是scanner.nextLine()会将光标移动到下一行。这就是为什么hasNextLine()只返回一个布尔值,而nextLine返回下一行中可用的实际输入字符串。我在这里有点困惑。你能给我解释一下这行是什么意思,或者给我演示一下正确的代码吗?Java是我的第一种编程语言,所以我有很多东西要学。@Studiegriffin“Consumes”表示它从输入中读取行。假设您的输入有三行,A
,B
,C
。假设有一个光标指向a
行的开头hasNextLine()
检查光标后是否有一行,但它不会移动光标。因此,每次调用它时,光标仍将位于A
的开头。这样就得到了无限递归。如果调用nextLine()
,它将读取行A
,此时光标将指向B
。这就是“消费”的含义。ajb是这么说的。您也可以在这里查看JavaDoc:@StewieGriffin.hasNextLine()不移动光标,它只是检查下一行是否存在。但是scanner.nextLine()会将光标移动到下一行。这就是为什么hasNextLine()只返回一个布尔值,而nextLine返回下一行中可用的实际输入字符串我的IDE会报告计数输入错误(input.next())part@StewieGriffin是的,我忽略了这一点,我更新了我的答案并更正了它。我的IDE在计数时报告了一个输入错误(input.next())part@StewieGriffin是的,我忽略了这一点,我更新了我的答案并更正了它。