英文:
How to scan this line and use scan.skip()?
问题
我有一个以以下格式的.txt文件:torch ; 3.0 ; 23.0
我想要扫描它,将第一个项目放入String中,将第二个和第三个项目放入float中。
到目前为止,我已经做了以下工作,但scan.skip(" ; ")
不起作用,我也尝试过scan.skip(Pattern.compile(" ; ")
,但也没有起作用。
File file = new File(dir);
try {
Scanner scan = new Scanner(file);
scan.skip(" ; ");
scan.useDelimiter(Pattern.compile(" ; "));
while (scan.hasNextLine()) {
String s = scan.next();
float f1 = scan.nextFloat();
float f2 = scan.nextFloat();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
您有解决方案吗?
谢谢
英文:
I have a .txt file with lines of this format example : torch ; 3.0 ; 23.0
I want to scan it in order to place the first item in a String, and the second and third in a float.
Here is what I have done so far but the scan.skip(" ; ")
doesn't work, I have also tried scan.skip(Pattern.compile(" ; ")
but it didn't work either.
File file = new File(dir);
try {
Scanner scan = new Scanner(file);
scan.skip(" ; ");
scan.useDelimiter(Pattern.compile(" ; "));
while (scan.hasNextLine()) {
String s = scan.next();
float f1 = scan.nextFloat();
float f2 = scan.nextFloat();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Do you have any solutions for me ?
Thanks
答案1
得分: 2
不要更改用于读取File
的Scanner
的分隔符。相反,实例化一个内部的Scanner
来解析从文件中读取的行。此外,我会使用 try-with-Resources
来确保Scanner
(和File
)被关闭。就像这样:
File file = new File(dir);
try (Scanner scan = new Scanner(file)) {
while (scan.hasNextLine()) {
Scanner lineScan = new Scanner(scan.nextLine());
lineScan.useDelimiter(Pattern.compile("\\s*;\\s*"));
String s = lineScan.next();
float f1 = lineScan.nextFloat();
float f2 = lineScan.nextFloat();
System.out.printf("%s %.2f %.2f%n", s, f1, f2);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
英文:
Don't change the delimiter of the Scanner
you're using to read the File
. Instead, instantiate an inner Scanner
to parse the lines you read from the file. Aslo, I would use a try-with-Resources
to make sure the Scanner
(and File
) are closed. Like,
File file = new File(dir);
try (Scanner scan = new Scanner(file)) {
while (scan.hasNextLine()) {
Scanner lineScan = new Scanner(scan.nextLine());
lineScan.useDelimiter(Pattern.compile("\\s*;\\s*"));
String s = lineScan.next();
float f1 = lineScan.nextFloat();
float f2 = lineScan.nextFloat();
System.out.printf("%s %.2f %.2f%n", s, f1, f2);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
答案2
得分: 2
以下是您要求的翻译内容:
Scanner scan = new Scanner(file);
scan.useDelimiter(Pattern.compile("[;\\n]"));
while (scan.hasNextLine()) {
String s = scan.next();
float f1 = Float.parseFloat(scan.next());
float f2 = Float.parseFloat(scan.next());
System.out.println(s + " " + f1 + " " + f2);
}
英文:
You may use ;
or \n
as delimiter and no need to skip, also I'd suggest to use Float.parseFloat(scan.next());
Scanner scan = new Scanner(file);
scan.useDelimiter(Pattern.compile("[;\\n]"));
while (scan.hasNextLine()) {
String s = scan.next();
float f1 = Float.parseFloat(scan.next());
float f2 = Float.parseFloat(scan.next());
System.out.println(s + " " + f1 + " " + f2);
}
答案3
得分: 2
以下是您要的翻译部分:
然而,我想解释一下为什么您的代码不起作用,以及如何让它起作用。
请查看Scanner#skip(String pattern)
的文档,它指出:
>如果在当前位置找不到与指定模式匹配的内容,则不会跳过任何输入,而会抛出NoSuchElementException。
因此,您的scan.skip(" ; ");
会阻塞线程,并继续读取标记,直到输入与指定模式(;
)匹配以跳过,或抛出NoSuchElementException为止。
如果要使用.skip(..)
,您只需更改方法调用的顺序,如下所示:
try {
Scanner scan = new Scanner(file);
while (scan.hasNextLine()) {
String s = scan.next();
scan.skip(" ; ");
float f1 = scan.nextFloat();
scan.skip(" ; ");
float f2 = scan.nextFloat();
}
}
英文:
Answers provided here or here would solve your problem.
However, I want to explain why your code does not work, and how can you make it work.
Have a look at Scanner#skip(String pattern)
documentation, which says, that:
>If a match to the specified pattern is not found at the current position, then no input is skipped and a NoSuchElementException is thrown.
So, your scan.skip(" ; ");
blocks the thread, and keeps reading the tokens, until your input matches the specified pattern (;
) to skip, or a NoSuchElementException
is thrown.
If you want to use .skip(..)
, you can just change the order of your method calls, like:
try {
Scanner scan = new Scanner(file);
while (scan.hasNextLine()) {
String s = scan.next();
scan.skip(" ; ");
float f1 = scan.nextFloat();
scan.skip(" ; ");
float f2 = scan.nextFloat();
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论