Java 使用递归计算标准输入中剩余要读取的字符串数

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

我想写一个方法,它有一个与输入流关联的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 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是的,我忽略了这一点,我更新了我的答案并更正了它。