如何在两种方法中使用格式化输入对两个不同的扫描仪使用相同的输入

how to use the same input for two different scanners in two methods with formatted input

提问人:Arnab Kar 提问时间:10/14/2022 最后编辑:Arnab Kar 更新时间:10/14/2022 访问量:86

问:

我意识到问题是由于我创建了一个新的扫描仪/读取器对象(新扫描仪有一个空白输入),问题仍然存在 - 我如何对两种方法使用相同的输入流(或)如何对两种方法使用相同的扫描仪读取器

原始问题:如何将主方法输入流传递给被调用的方法

所以我正在接受格式化的输入,就像极客的极客一样(这对我的错误很重要)

1
4
1 2 3 4

我正在使用 scanner 类将数字读入变量中。这是我的代码

// code to print reverse of input string after reading the length of the string and no. of testcases
class Main {
    public static void main (String[] args) {
        int i,t,n;
        String x,y;
        Scanner scan = new Scanner(System.in);
        try {
            t=scan.nextInt();
            scan.nextLine();
            REV rv=new REV();
            for (i=0;i<t;i++){
                rv.reverse();
            }
        }catch (Exception e){
            return;
        }
    }
}
class REV{
    public void reverse(){
        int i,a[],n;
        Scanner scan = new Scanner(System.in);
        try {
            n=scan.nextInt();
            scan.nextLine()
            a= new int[n];
            for (i=n-1;i>=0;i--){
                a[i]=scan.nextInt();
            }
                System.out.println(a[i]);
        }catch(Exception E){
            return;
        }
    }
}

我没有得到任何输出(java.util.NoSuchElementException,如果我不使用 try 和 catch)

我能够读取 main 方法中的变量,但我的输入流对于新方法变为空

我通过使用方法和方法验证了这一点,如图所示nextLine()main()reverse()

    public static void main (String[] args) {
        int t,n;
        String x,y,z;
        t=scan.nextInt();
        x=scan.nextLine();
        n=scan.nextInt();          //to eat up the n input
        y=scan.nextLine();
        z=scan.nextLine();
        System.out.println(x+y);
        ....
    }

输出-

141 2 3 4

    public void reverse(int n){
        ....
        String k,j;
        k = scan.nextLine();      //replacing n- to check what n=scanInt() reads
        j= scan.nextLine();
        System.out.println(x +y);
        ....
    }

输出再次为空 (java.util.NoSuchElementException)

我认为这意味着该方法的输入流为空。 那么我如何将输入传递给reverse()main()reverse()

注意:1.如果我不使用,它给了我try{}catch{}java.util.NoSuchElementException

  1. 我知道我使代码变得有点复杂,这是由于我试图解决这个问题

  2. 我从这里得到了解决方案,但它并不能解决我的空输入问题try{}catch{}

4.这让我明白了空输入异常

java.util.scanner 输入流

评论

0赞 Nili 10/14/2022
与其创建 Rev 类的 Object,不如创建一个 reverse() 方法。 另外,您可以发布所需的输出吗?private static void reverse(){...}System.out.println(Arrays.toString(a));

答:

0赞 Nili 10/14/2022 #1

创建一个方法,而不是创建一个类的 Object,然后调用该方法。(除非你想要那样)。

创建一个并在任何地方使用它。static Scanner

private static Scanner scanner = new Scanner(System.in)

要打印使用 .arraySystem.out.println(Arrays.toString(a));

还原剂使用后。scanner.nextLine()Scanner.nextInt

import java.util.Arrays;
import java.util.Scanner;

class Main {
    private static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        int i, t, n;
        String x, y;

        t = scanner.nextInt();
        for (i = 0; i < t; i++) {
            reverse();
        }
    }

    private static void reverse() {
        int i;
        int[] a;
        int n;

        n = scanner.nextInt();
        a = new int[n];
        for (i = n - 1; i >= 0; i--) {
            a[i] = scanner.nextInt();
        }
        System.out.println(Arrays.toString(a));
    }
}

Output of the code above

这是您想要的输出吗?

评论

0赞 Arnab Kar 10/14/2022
是的!这正是我所需要的!我对此还有其他问题。1. 如果我使用public而不是private,我可以在其他方法中使用scanner对象吗?(我是 java 新手)
0赞 Nili 10/15/2022
是的,您可以根据需要使用任何访问修饰符。请参阅文档 docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html 当然,您也可以将扫描仪用于其他方法,但是如果您要制作不同的类,请在那里制作一个。new Scanner