Java 读取行,直到满足int
如果我有以下输入:Java 读取行,直到满足int,java,java.util.scanner,Java,Java.util.scanner,如果我有以下输入: sometext 23,1 -54.2 42 sometext 42,6 32 -56 如何先读取字符串,然后读取数字 for(int i = 0 ; i < numLines ; i++){ name = scanner.nextLine() // Here i want to save "sometext" for(int j = 0 ; j < numNumbers ; j++){ numbers.add
sometext 23,1 -54.2 42
sometext 42,6 32 -56
如何先读取字符串,然后读取数字
for(int i = 0 ; i < numLines ; i++){
name = scanner.nextLine() // Here i want to save "sometext"
for(int j = 0 ; j < numNumbers ; j++){
numbers.add(scanner.nextFloat());
}
cities.add(new City(name, numbers));
numbers.clear();
}
for(int i=0;i
一般情况下,永远不要调用下一行的
。它不做你认为它做的,它做的,几乎完全是无用的。是的,它出现在阳光下的每个教程中。1
如果需要字符串,只需调用.next()
因此,在这里,您应该调用next()
读取字符串,调用nextDouble
读取双精度。除非你有非常奇怪的输入,有时会出现逗号,有时会出现点来分隔输入。你复印这封信时有没有打错?如果这确实是您的输入,那么您只能使用next()
,然后您必须先按摩这个破碎的疯狂输入,然后再将其转换为数字
此外,您也不想使用float
。只需使用double2。为了一切。不,它不是“效率较低”或“占用更多内存”。这样更好,免费的
那是一个打字错误,输入是一致的。
确保扫描仪设置了正确的区域设置,否则它将使用,
作为分隔符,而不是,
,反之亦然。设置区域设置失败意味着根据您所在主机系统的配置,您的应用程序将随机无法工作,这通常是您不希望的。例如,可以使用scanner.useLocale(Locale.ENGLISH)
执行此操作
然后:
你也有一个bug
Java是按值传递的,但是数字是一个引用。就像我在一张纸条上给你一栋楼的地址,然后我开车过去,把房子烧成灰烬。我给你的地址写在你开车带着的复印纸上并不重要。如果你按照你的个人地址,你仍然会发现一所烧毁的房子
因此,当您编写numbers.clear()
时,您正在从新创建的城市中删除这些数字。你想要什么,而不是numbers.clear()
,这是java ese的意思:“拿一张你命名为numbers
,上面写着地址的纸,开车过去,把房子烧掉。”,然后用:numbers=new ArrayList()
代替它,这是java ese的意思:“在一块空地上盖一所新房子。拿一张名为<代码>数字
的纸,擦除上面写的任何内容。现在记下这幢新房子的地址。”
您需要第二件事。请记住,
是java ese for:Drive to the address write on here,=
是:弄乱地址本身,不要在任何地方驾驶
1] 使用Scanner不需要遵循这个推理,但对于那些想知道我为什么这么说的人来说:混合nextLine和NextAnything会导致可怕的问题,通常只需使用nextLine
返回一个空字符串。你可以调用“空白”nextLine(不要将它分配给任何东西),但如果用户在键盘上按了一个很大的中央键,那么您的输入处理就会中断,因此这似乎是一个不好的举动,即使这是常见的建议。真正的解决方案是将分隔符更新为\\R
,但一旦这样做,您就不需要下一行来读取行,只需要下一行就可以了。只使用nextLine确实工作得很好,但如果这是您想要的,只需..制作一个BufferedReader,扫描器就太过分了。结论:nextLine在任何情况下都是没有意义的
2] 如果某个协议明确规定使用浮点数,或者您对IEEE样式的浮点数了如指掌,那么您就知道什么时候可以忽略此建议。在您忽略此建议之前,请注意。此代码将起到以下作用:
for(int i = 0 ; i < numLines ; i++){
name = scanner.next();
for(int j = 0 ; j < numNumbers ; j++){
numbers.add(scanner.nextFloat());
}
cities.add(new City(name, numbers));
numbers.clear();
}
for(int i=0;i
在您的情况下:是否可以使用scanner.next
而不是scanner.nextLine()
?这仅在“sometext”没有任何空格分隔的情况下才有效。您可以查看hasNext(模式)
并传递一个只与单词匹配的正则表达式。但您也可以尝试读取整行并对其进行解析,例如在空格处拆分。
String raw = scanner.next();
raw = raw.replace(",", ".");
numbers.add(Double.parseDouble(raw));
for(int i = 0 ; i < numLines ; i++){
name = scanner.next();
for(int j = 0 ; j < numNumbers ; j++){
numbers.add(scanner.nextFloat());
}
cities.add(new City(name, numbers));
numbers.clear();
}