String Tokenizer 在使用 BufferedReader 获取 space 分离值时给出异常

String Tokenizer giving exception while taking space saperated values using BufferedReader

我尝试开始使用 BufferedReader 而不是 Scanner。在为 codechef (SMRSTR) 上的问题编码时,我尝试使用 StringTokenizer 获取 space 分隔的输入,但它引发了异常,即 NumberFormatException。我在 Whosebug 上发现了一些关于它的问题,但我认为我的问题不同,所以我发布了一个。
输入:1
2 3
2 3
5 100 8

我得到:

Exception in thread "main" java.lang.NumberFormatException: For input string: "2 3"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at A.main(A.java:11)

我从 br.readLine(); 中正确地获得了第一个输入 t 但是下一个输入 n,q 给出了上述异常。我认为问题出在 StringTokenizer 的 nextToken 中,但仍然没有弄清楚。

代码如下:

import java.io.*;
import java.util.*;

 class A{
public static void main(String arg[]) throws IOException
{

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer s = new StringTokenizer(br.readLine());

    int t= Integer.parseInt(br.readLine());
    while(t-->0)
    {
        int n,q,i;
        n=Integer.parseInt(s.nextToken());
        q=Integer.parseInt(s.nextToken());
        int D[]= new int[n];
        int Q[]=new int[q];
        long x=1;
        for(i=0;i<n;i++)
        {
            D[i]=Integer.parseInt(s.nextToken());
            x=x*D[i];
        }
        for(i=0;i<q;i++)
        {
            Q[i]=Integer.parseInt(s.nextToken());
            if(x>1000000000)
                Q[i]=0;
            else
            Q[i]=(int)(Q[i]/x);
        }
        for(i=0;i<q;i++)
            System.out.print(Q[i]+" ");
    System.out.println("");
    }
}
}

假设您的第一行是一个数字,第二行是一串 space 分隔的数字(如果不是,请用您的实际输入编辑您的问题)

我想你想这样阅读t

int t = Integer.parseInt(s.nextToken());

然后将你的下一行读入你的分词器

s = new StringTokenizer(br.readLine());

while循环之前的代码应该是:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer s = new StringTokenizer(br.readLine());

int t = Integer.parseInt(s.nextToken());
s = new StringTokenizer(br.readLine());

编辑

在使用下一个 Int 方法之前,您需要阅读分词器中的每一行。这应该有效。

输入:

1 
2 3  
2 3 
5 100 8

输出:

0 16 1 

工作代码:

public static void main(String arg[]) throws IOException {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    // read first line in tokenizer
    StringTokenizer s = new StringTokenizer(br.readLine());
    //parse t
    int t = Integer.parseInt(s.nextToken());

    // read second line in tokenizer
    s = new StringTokenizer(br.readLine());

    while(t-->0) {
        int n,q;
        // parse n and q (2, 3)
        n=Integer.parseInt(s.nextToken());
        q=Integer.parseInt(s.nextToken());

        int D[]= new int[n];
        int Q[]=new int[q];
        long x=1;
        // read third line in tokenizer
        s = new StringTokenizer(br.readLine());
        for(int i=0;i<n;i++) {
            D[i]=Integer.parseInt(s.nextToken());
            x=x*D[i];
        }
        // read fourth line in tokenizer
        s = new StringTokenizer(br.readLine());
        for(int i=0;i<q;i++) {
            Q[i]=Integer.parseInt(s.nextToken());
            if(x>1000000000)
                Q[i]=0;
            else
                Q[i]=(int)(Q[i]/x);
        }
        for(int i=0;i<q;i++)
            System.out.print(Q[i]+" ");

        System.out.println("");
    }
}