使用扫描程序从列表中读取整数和字符串

时间:2017-10-07 19:05:04

标签: java

我正在读取stdin的字符串,该字符串被格式化为列表。我正在使用字符串中的信息来创建对象。

示例输入字符串的格式如下:

1 apple, 3 bananas, 2 pears

我希望在我去的时候读取该行创建对象,但我最大的问题是正确读取行以获取项目数,然后是项目本身,同时也跳过空格和逗号。 我尝试过以下方法:

Scanner input = new Scanner(System.in);
input.useDelimeter(",|\\s");
while(input.hasNext()){
    int numItems = input.nextInt();
    String item = input.next();

    // create object and add to object array
}

哪个适用于第一次迭代(1个苹果),但在第二个类型不匹配时失败。任何人都可以建议修复或替代解决方案吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

,|\\s声明了两个单独的分隔符。这些分隔符可以在文本"apple, 3"中匹配两次:

  1. 逗号apple
  2. 之后的逗号
  3. 3之前的空间

    苹果,3      ^^      12

  4. 所以我们将这个文本分成两个独立的(中间)位置,这意味着我们将它分成3个标记:

    • "apple"
    • ""
    • "3"

    在下一次迭代中(在调用消耗input.next()的{​​{1}}之后),您正在调用apple扫描程序尝试将第二个令牌解析为int,但由于它找到空字符串,因此它会抛出异常。

    其中一个解决方案是将input.nextInt()[space]视为单个分隔符。你可以通过逗号选择来实现它:

    ,[space]

    演示:

    input.useDelimiter(",?\\s");
    

    输出:

    Scanner input = new Scanner("1 apple, 3 bananas, 2 pears");
    input.useDelimiter(",?\\s");
    while(input.hasNext()){
        int numItems = input.nextInt();
        System.out.println(numItems);
        String item = input.next();
        System.out.println(item);
        System.out.println("----");
    }
    

答案 1 :(得分:0)

您可以使用分隔符","来填充输入字符串。使用trim()方法后得到以下输出。

1个苹果

3个香蕉

2梨

以下是代码:

 String [] array1 = input.nextLine().split(",");

 for(int i=0; i<array1.length; i++){
    System.out.println(array1[i].trim());
 }

编辑:您可以使用分隔符for loop进一步拆分space内的字符串,以获得所需的输出。