java—使用字符串标记器获取不同行上的输入

gwo2fgha  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(377)

我已经使用scanner(system.in)很长一段时间了,但是我现在正在过渡到使用bufferedreader和stringtokenizer,因为我听说它运行得更快。我正在尝试使用stringtokenizer读取输入(如下所示)。我看了一些帖子,但没有找到任何能解决这个问题的。

5
2 3 2 2 3

这是我的密码:

import java.util.*;
import java.io.*;
public class FindDistinct {

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

        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw = new PrintWriter(System.out);
        StringTokenizer st = new StringTokenizer(r.readLine());
        int n = Integer.parseInt(st.nextToken());
        HashSet<Integer> set = new HashSet<Integer>();

        for (int i = 0; i < n; i++) {
            set.add(Integer.parseInt(st.nextToken()));
        }

        pw.println(set.size());
        pw.close();
        r.close();

    }

}

我得到的错误是:

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.StringTokenizer.nextToken(StringTokenizer.java:348)
    at FindDistinct.main(FindDistinct.java:16)

我认为发生错误是因为我正在读取多行输入。我该怎么解决这个问题?顺便说一句,这是竞争编程,所以我正在寻找解决方案,将运行迅速。提前谢谢!

14ifxucb

14ifxucb1#

来自javadoc的 StringTokenizer :
{@CodeStringTokenizer}是一个遗留类,出于兼容性的原因保留它,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人改用{@code string}的{@code split}方法或java.util.regex包。
但是您的问题是,您只从缓冲读取器中读取一行,因此您的令牌化器只有一个令牌,但是您尝试读取下一个令牌 n 它的代币。
您需要读取另一行并创建另一个stringtokenizer。
我怀疑这种方法和 Scanner 这很重要。在竞争规划问题中,找到一个有效的算法是关键。

相关问题