我有这段代码:
Set<String> uniquePairs = new HashSet<String>();
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
sc.useDelimiter(System.getProperty("line.separator"));
for(int i=0; i<t ;++i) {
if(sc.hasNext()) {
String element = sc.next();
uniquePairs.add(element);
System.out.println(uniquePairs.size());
}
}
输入:
5
john tom
john mary
john tom
mary anna
mary anna
我的输出(标准输出)
1
2
3
3
4
预期输出
1
2
2
3
3
为何与众不同?归因于Scanner$nextLine();
?
但是,如果我执行以下更改,我会得到正确的输出:
删除该行:
sc.useDelimiter(System.getProperty("line.separator"));
替换行:
String element = sc.next();
使用:
String element = sc.next() + " " + scan.next()j
请澄清一下吗?
答案 0 :(得分:2)
以下是给出错误输出的代码:
Set<String> uniquePairs = new HashSet<String>();
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
sc.useDelimiter(System.getProperty("line.separator"));
for(int i=0; i<t ;++i) {
if(sc.hasNextLine()) {
String element = sc.nextLine();
uniquePairs.add(element);
System.out.println(uniquePairs.size());
}
<强>输出:强>
1
2
3
3
4
问题是,一旦你读到int
值,就会留下new line character
并在循环中读取并产生错误的结果。您可以使用new line character
来电阅读nextLine()
并忽略它。然后根据要求使用nextLine()
方法。
以下是产生正确结果的代码。
Set<String> uniquePairs = new HashSet<String>();
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
sc.nextLine(); // Ignore the next line char.
for(int i=0; i<t ;++i) {
if(sc.hasNextLine()) {
String element = sc.nextLine();
uniquePairs.add(element);
System.out.println(uniquePairs.size());
}
<强>输出:强>
1
2
2
3
3