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();
}