我正在从标准输入读取一个格式化为列表的字符串。我正在使用字符串中的信息来创建对象。
示例输入字符串的格式如下:
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 个苹果),但在第二次迭代中因类型不匹配而失败。任何人都可以建议修复或替代解决方案吗?
谢谢!
最佳答案
,|\\s
声明两个单独的分隔符。这些分隔符可以在文本 "apple, 3"
中匹配两次:
apple
后的逗号3 之前有空格
苹果,3 ^^ 12
因此我们将该文本拆分为两个单独的(中间)位置,这意味着我们将其拆分为 3 个标记:
“苹果”
,""
,“3”
。
在下一次迭代中(调用消耗 apple
的 input.next()
后),您正在调用 input.nextInt()
扫描仪尝试将第二个标记解析为 int,但由于它发现空字符串,因此抛出异常。
解决方案之一是将[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
apple
----
3
bananas
----
2
pears
----
关于java - 使用扫描仪从列表中读取整数和字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46624069/