我已经使用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)
我认为发生错误是因为我正在读取多行输入。我该怎么解决这个问题?顺便说一句,这是竞争编程,所以我正在寻找解决方案,将运行迅速。提前谢谢!
1条答案
按热度按时间14ifxucb1#
来自javadoc的
StringTokenizer
:{@CodeStringTokenizer}是一个遗留类,出于兼容性的原因保留它,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人改用{@code string}的{@code split}方法或java.util.regex包。
但是您的问题是,您只从缓冲读取器中读取一行,因此您的令牌化器只有一个令牌,但是您尝试读取下一个令牌
n
它的代币。您需要读取另一行并创建另一个stringtokenizer。
我怀疑这种方法和
Scanner
这很重要。在竞争规划问题中,找到一个有效的算法是关键。