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



我已经使用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)

我认为发生错误是因为我正在读取多行输入。我该如何解决这个问题?顺便说一句,这是针对竞争性编程的,所以我正在寻找能够快速运行的解决方案。提前感谢!

来自StringTokenizer:的Javadoc

  • {@code StringTokenizer}是一个遗留类,由于兼容性原因被保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人使用{@code String}的{@code split}方法或java.util.regex包

但您的问题是,您只从缓冲读取器中读取一行,因此您的令牌生成器只有一个令牌,但随后您尝试从中读取下一个n令牌。

您需要读取另一行并创建另一个StringTokenizer。

我怀疑这种方法与Scanner之间的任何性能差异是否重要。在竞争性编程问题中,找到一个有效的算法是关键。

相关内容

  • 没有找到相关文章

最新更新