使用Scanner读取Java中的整行String

时间:2015-10-07 14:28:10

标签: java set java.util.scanner

我有这段代码:

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
    

请澄清一下吗?

1 个答案:

答案 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